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类型对象的情况,以及一个传递一对迭代器的情况。如果模板化的构造函数在主模板中定义,代码工作正常,这是代码当前的工作方式,但我更倾向于将定义移到声明之外。 编辑:我应该提一下,我不能在定义中重新使用enable_if&lt; ...>,因为enable_if&lt; ...>为其类型分配了一个默认值,在非定义中你不能这样做也是一个宣言。     
已邀请:
我不这样做。这是我要做的改变:
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*)
{ ... }
这直接来自
enable_if
的文档。     
这是你想要完成的吗? [我没有
is_iterator
类型特征,所以我使用C ++ 0x类型特征和实用程序库重新设计了您的示例。它应该与TR1和Boost库的工作方式相同。]
#include <utility>
#include <type_traits>

template <typename T>
struct S
{
    // Constructor (1)
    S(T, T); 

    // Constructor (2)
    template <typename U>
    S(U, U, typename std::enable_if<std::is_integral<U>::value>::type* = 0);
};

template <typename T>
S<T>::S(T, T)
{ }

template <typename T>
template <typename U>
S<T>::S(U, U, typename std::enable_if<std::is_integral<U>::value>::type*)
{ }

int main()
{
    S<double> a(1.0, 2.0); // uses (1)
    S<double> b(1, 2);     // uses (2)
}
    
你能做的最简单的事是:
template<class Iterator>
Foo
  ( Iterator first
  , typename enable_if<is_iterator<Iterator>, Iterator>::type last
  );
    
template <class T>
struct Foo
  {
    Foo(T a, T b);

    template <class Iterator
      ,       class = typename std::enable_if
                       <is_iterator<Iterator>::value>
                       ::type
      >
    Foo
      ( Iterator first
      , Iterator last
      );
  };

template <class T>
Foo<T>::Foo(T a, T b)
{  }

template <class T>
template
  < class U
  , class >
Foo<T>::Foo(U f, U l)
{  }
    

要回复问题请先登录注册