【发布时间】:2011-07-15 04:11:48
【问题描述】:
假设我有一个带有两个参数的模板(称为 ExampleTemplate):一个容器类型(例如列表、向量)和一个包含类型(例如浮点数、布尔值等)。因为容器实际上是模板,所以这个模板有一个模板参数。这是我必须写的:
#include <vector>
#include <list>
using namespace std;
template < template <class,class> class C, typename T>
class ExampleTemplate {
C<T,allocator<T> > items;
public:
....
};
main()
{
ExampleTemplate<list,int> a;
ExampleTemplate<vector,float> b;
}
您可能会问“分配器”是什么。好吧,最初,我尝试了显而易见的事情......
template < template <class> class C, typename T>
class ExampleTemplate {
C<T> items;
};
...但不幸的是我发现分配器的默认参数...
vector<T, Alloc>
list<T, Alloc>
etc
...必须在模板声明中明确“保留”。 如您所见,这使代码更丑陋,并迫使我重现模板参数(在本例中为分配器)的默认值。
这是不好。
编辑:这个问题不是关于容器的具体问题——它是关于“模板参数的模板中的默认值”,上面只是一个例子。取决于 STL 容器具有“::value_type”的知识的答案不是我所追求的。想想一般的问题:如果我需要在模板ExampleTemplate 中使用模板参数C,那么在ExampleTemplate 的主体中,我使用时是否必须重现C 的默认参数?如果我不得不这样做,那不会引入不必要的重复和其他问题(在这种情况下,C 是 STL 容器,可移植性问题 - 例如“分配器”)?
【问题讨论】:
-
更糟的是,你的代码不能在所有编译器上工作,因为标准库容器可能有(并且在某些实现中做)更多具有标准值的模板参数.这段代码实际上是不可移植的。
-
同意。我真希望我不必求助于宏……天哪,除了宏……
-
如果您让我们更深入地了解您实际尝试做的事情,这可能有助于从您的非常具体的问题中展开。你所要求的是不可能的。
-
@Mike:“我所要求的是不可能的” - 如果我理解正确,您的意思是当我将模板参数 C 传递给模板(MyExample)时,在 MyExample 的正文中,我必须手动重现 C 的默认参数。这就是你的意思吗?
-
@Konrad,我想extra template arguments weren't allowed 正是因为这个用例带有模板模板参数。