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

Set*_*gie 21 c++ templates overloading

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

例如:

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

template<typename T, typename T2>
class Blah {
public:
    void operator()(T, T2);
};
Run Code Online (Sandbox Code Playgroud)

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

Fle*_*exo 25

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

  • @ben - 它不像那样工作,因此部分特化有效地给出了模板参数数量的"重载" (2认同)

Ker*_* SB 15

模板只能有一个基本定义.如果你需要一个可变数量的参数,并且你不想像@awoodland建议那样使用"null type"结构,如果你有一个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
Run Code Online (Sandbox Code Playgroud)