сигнатура типа конструктора шаблонного шаблона 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)
{ ... }

Я пробовал несколько вещей в слоте WHAT_GOES_HERE , чтобы попытаться получить подходящую подпись, и у меня все не получается. Мне нужен enable_if, чтобы различать случай, когда один передает два объекта типа T, и когда один передает пару итераторов. Код работает нормально, если шаблонный конструктор определен внутри основного шаблона, как в настоящее время делает код, но я бы предпочел переместить определение за пределы объявления.

EDIT: Я должен упомянуть, что я не может просто повторно использовать enable_if <...> в определении, потому что enable_if <...> присваивает значение по умолчанию для его типа, чего нельзя сделать в определении, которое также не является объявлением.

6
задан swestrup 27 February 2011 в 20:26
поделиться