我通常会声明我的类和模板,然后在(在当前的头文件中)定义它们的方法。我发现这样更容易阅读。那么,我遇到了一个案例,我无法弄清楚一个工作类型签名是否在一个不符合类的定义中使用。下面是我在做什么一个简单的例子,说明该问题:类型的enable_if'ed模板模板构造函数的签名?
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
(Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
我已经尝试了一些在WHAT_GOES_HERE
插槽的东西,试图得到一个匹配的签名,我一直失败。我需要使用enable_if来区分两个T类型对象传入的情况,以及一个传入一对Iterator时的情况。如果模板化的构造函数是在主模板内部定义的,那么代码就可以正常工作,而代码目前是这样做的,但我宁愿将该定义移动到声明之外。
编辑:我要指出,我不能只重复使用enable_if < ...>的定义,因为enable_if < ...>指定其类型,你不能做一个缺省值一个定义也不是一个声明。
你真的需要SFINAE这个?如果您只声明第二个构造函数为'template Foo(U first,U last);',如果调用者传递两个类型为T的对象,则仍然会选择第一个构造函数。 –
2011-02-27 20:21:47
类型T通常是一种算术类型,我希望在T无符号时能够传入整数,反之亦然,并且没有调用模板构造函数(在使用enable_if之前发生了这种情况) – swestrup 2011-02-27 20:29:13
实际上,你根本没有分配一个默认值。你的模板的第二个参数是'enable_if''。有点像如果你期望一个'int'。它不应该编译,当然也不可能使用。 –
2011-02-27 20:33:42