按模板参数编号重载模板类

时间:2011-08-08 21:08:10

标签: c++ templates overloading

是否可以拥有相同类的多个版本,这些版本仅在模板参数的数量上有所不同?

例如:

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

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

我正在尝试模拟仿函数类型的东西,它可以采用可变数量的参数(最多可以写出不同模板的数量)。

3 个答案:

答案 0 :(得分:24)

最简单的答案是只有一个模板,您希望支持的最大数量,并在除第一个类型之外的所有类型上使用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);
}

答案 1 :(得分:15)

模板只能包含一个基本定义。如果你需要一个可变数量的参数而你不想像@awoodland建议的那样使用“null type”结构,并且如果你有一个C ++ 0x编译器,那么你可以使用variadic模板:

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

答案 2 :(得分:0)

这是未经测试的代码,我没有版本的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);
};

等。等