【发布时间】:2010-12-20 00:28:18
【问题描述】:
是否可以在不指定或不知道这些参数的情况下转发声明使用默认参数的类?
例如,我想在 Traits 类中声明一个boost::ptr_list< TYPE >,而不是将整个 Boost 库拖到包含该特征的每个文件中。我想申报
namespace boost { template<class T> class ptr_list< T >; },但这不起作用,因为它与真正的类声明不完全匹配:
template < class T,
class CloneAllocator = heap_clone_allocator,
class Allocator = std::allocator<void*>
>
class ptr_list { ... };
我的选择是只接受它还是在我的特征类中指定boost::ptr_list< TYPE, boost::heap_clone_allocator, std::allocator<void*>? (如果我使用后者,我还必须转发声明 boost::heap_clone_allocator 并包含 <memory>,我想。)
我浏览了 Stroustrup 的书 SO,以及互联网上的其他内容,但没有找到解决方案。通常人们担心不包含 STL,解决方案是“只包含 STL 头”。但是,Boost 是一个更庞大且编译器密集型的库,因此除非绝对必要,否则我宁愿不使用它。
【问题讨论】:
-
Boost 是一组主要只有标头的库。为什么不只使用您需要的那些组件(及其依赖项)?并不是说不涉及任何工作,但这就是我们通常所做的。
-
我愿意 -- ptr_list 是我唯一需要的文件。唯一的问题是单个 Boost 标头包含许多其他标头。 makedepend 的一个简单应用表明,just ptr_list 至少包含 385 个文件:boost 的 config、detail、iterator、mpl、preprocessor、range、smart_ptr、type_traits 和 utility——用于命名主要模块。你肯定能理解我是如何避免在我不需要的时候加入的。
-
难怪编译时间飞涨。是的,包含这么多文件可能很烦人。但我认为正确的问题是:有没有办法找出为什么包含这些文件?是否可以将这些包含的文件划分为仅包含必要的内容。似乎没有捷径可走。
-
由于类声明是一个不可分割的组成部分,如果该类的任何函数在头文件中使用了某个不起眼的mpl特性,那么所有使用该类的代码都必须包含该mpl头文件。这很令人痛心。
-
假设您主要关心的是减少编译时间,ccache old.nabble.com/Use-of-ccache-with-Boost-td25663689.html 可能会有用。
标签: c++ templates forward-declaration