Перегрузка шаблонных классов по номеру параметра шаблона - PullRequest
20 голосов
/ 09 августа 2011

Возможно ли иметь несколько версий одного и того же класса, которые отличаются только количеством аргументов шаблона, которые они принимают?

Например:

template<typename T>
class Blah {
public:
    void operator()(T);
};

template<typename T, typename T2>
class Blah {
public:
    void operator()(T, T2);
};

Я пытаюсь смоделироватьвещи типа функтора, которые могут принимать переменное количество аргументов (вплоть до количества различных шаблонов, которые были записаны).

Ответы [ 3 ]

24 голосов
/ 09 августа 2011

Самый простой ответ будет иметь только один шаблон с максимальным числом, которое вы хотите поддерживать, и использовать void для типа по умолчанию для всех типов, кроме первого.Тогда вы можете использовать частичную специализацию по мере необходимости:

template<typename T1, typename T2=void>
struct foo {
    void operator()(T1, T2);
};

template <typename T1>
struct foo<T1, void> {
     void operator()(T1);
};

int main() {
   foo<int> test1;
   foo<int,int> test2;
   test1(0);
   test2(1,1);
}
15 голосов
/ 09 августа 2011

Шаблон может иметь только одно базовое определение. Если вам нужно переменное количество аргументов и вы не хотите использовать конструкции «нулевого типа», как предлагает @awoodland, и если у вас есть компилятор C ++ 0x, то вы можете использовать шаблоны с переменным числом аргументов:

template <typename ...Dummy> struct foo; // base case, never instantiated!

template <typename T> struct foo<T> { /*...*/ };  // partial spec. for one parameter
template <typename T, typename U> struct foo<T, U> { /*...*/ };  // ditto for two
0 голосов
/ 09 августа 2011

Это непроверенный код, у меня нет удобной версии Boost, но все равно все идет

#include "boost/tuple.h"

template <class T>
class Blah;

template <class T>
class Blah< boost::tuple<T> >
{
  void operator()(T arg);
};

template <class T, class U>
class Blah< boost::tuple<T, U> >
{
  void operator()(T arg1, U arg2);
};

и т.д.. и т.д.

...