【发布时间】:2011-07-05 08:57:08
【问题描述】:
我通常声明我的类和模板,然后定义它们的方法(当然是在同一个头文件中)。我只是觉得这样更容易阅读。好吧,我遇到了一个案例,我无法确定在类外定义中使用的工作类型签名。这是我正在做的一个简化示例,它说明了问题:
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 类型对象的情况,以及一个传入一对迭代器的情况。如果模板化的构造函数是在主模板中定义的,则代码可以正常工作,这就是代码当前的工作方式,但我更愿意将定义移到声明之外。
编辑:我应该提一下,我不能只在定义中重复使用 enable_if<...>,因为 enable_if<...> 为其类型分配了一个默认值,它你不能在一个不是声明的定义中做。
【问题讨论】:
-
你真的需要 SFINAE 吗?如果你只是将第二个构造函数声明为
template <typename U> Foo(U first, U last);,那么如果调用者传递了两个T类型的对象,则仍然会选择第一个构造函数。 -
Type T 通常是算术类型,我希望能够在 T 无符号时传入整数,反之亦然,并且不调用模板化构造函数(这在我之前已经发生过)使用了 enable_if)
-
实际上,您根本没有分配默认值。模板的第二个参数是
enable_if< is_iterator< FirstParam > >。有点像如果您期望int。它不应该编译,当然也不可能使用。 -
我不清楚。 enable_if 为其模板参数分配默认类型,这是分配默认值的元版本。
-
模板默认参数如下所示:
template < typename T, typename T2 = xxxx >
标签: c++ templates boost constructor enable-if