swe*_*rup 6 c++ templates constructor boost enable-if
我通常会声明我的类和模板,然后在(在相同的头文件中)之后定义它们的方法.我发现这种方式更容易阅读.好吧,我遇到过一个案例,我无法弄清楚在一个类外定义中使用的工作类型签名.这是我正在做的一个简化示例,它说明了问题:
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)
{ ... }
Run Code Online (Sandbox Code Playgroud)
我在WHAT_GOES_HERE插槽中尝试了很多东西来尝试获得匹配的签名,但我一直都在失败.我需要enable_if来区分一个传入两个T类型对象的情况,以及一个传递一对迭代器的情况.如果模板化的构造函数在主模板中定义,代码工作正常,这是代码当前的工作方式,但我更倾向于将定义移到声明之外.
编辑:我应该提一下,我不能在定义中重新使用enable_if <...>,因为enable_if <...>为其类型分配了一个默认值,在非定义中你不能这样做也是一个宣言.
我不会那样做。这是我要做的改变:
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
>
Foo
( Iterator first
, Iterator last
, typename enable_if<is_iterator<Iterator> >::type* = 0
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
>
Foo<T>::Foo(U f, U l, typename enable_if< is_iterator<U> >::type*)
{ ... }
Run Code Online (Sandbox Code Playgroud)
这是直接来自enable_if.