是否可以拥有相同类的多个版本,这些版本仅在模板参数的数量上有所不同?
例如:
template<typename T>
class Blah {
public:
void operator()(T);
};
template<typename T, typename T2>
class Blah {
public:
void operator()(T, T2);
};
我正在尝试模拟仿函数类型的东西,它可以采用可变数量的参数(最多可以写出不同模板的数量)。
答案 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);
};
等。等