Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按模板参数编号重载模板类_C++_Templates_Overloading - Fatal编程技术网

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

C++ 按模板参数编号重载模板类,c++,templates,overloading,C++,Templates,Overloading,同一个类是否可能有多个版本,而这些版本的模板参数数量不同 例如: template<typename T> class Blah { public: void operator()(T); }; template<typename T, typename T2> class Blah { public: void operator()(T, T2); }; 模板 课堂废话{ 公众: void运算符()(T); }; 模板 课堂废话{ 公众: void运

同一个类是否可能有多个版本,而这些版本的模板参数数量不同

例如:

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

template<typename T, typename T2>
class Blah {
public:
    void operator()(T, T2);
};
模板
课堂废话{
公众:
void运算符()(T);
};
模板
课堂废话{
公众:
void运算符()(T,T2);
};

我正在尝试对functor类型的东西进行建模,这些东西可以接受可变数量的参数(最多可以包含写出的不同模板的数量)。

最简单的答案是只有一个模板,最大数量为您想要支持的模板,并在除第一个类型之外的所有类型上使用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);
}
模板
结构foo{
void操作符()(T1,T2);
};
模板
结构foo{
void操作符()(T1);
};
int main(){
foo-test1;
foo-test2;
测试1(0);
试验2(1,1);
}
模板只能有一个基本定义。如果您需要可变数量的参数,并且不想使用@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
模板结构foo;//基本情况,从未实例化!
模板结构foo{/*…*/};//一个参数的部分规格
模板结构foo{/*…*/};//两个人也一样

这是未经测试的代码,我手边没有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);
};
#包括“boost/tuple.h”
模板
阶级空谈;
模板
类Blah
{
void运算符()(T arg);
};
模板
类Blah
{
void运算符()(T arg1,U arg2);
};

等等。

我认为如果某些类型是
void
@ben,那么
操作符()(t,T2,T3,T4)
的定义就不合适了-它不是那样工作的,因此部分专门化有效地给了模板参数数量上的“过载”谢谢,使用部分模板专门化技巧,它可以工作。非常感谢,我会在6分钟内把这个标记为答案。@awoodland:看起来不错。比我评论的时候你的答案好多了。@Nikolai:问题的提问者在评论中说他使用的是MSVC++2010,而MSVC++2010。也就是说,如果你想添加它,它可能是一个有效且有用的答案。我想知道你是否可以对类型列表做些什么。@john这是一个好主意,但我使用的MSVC++2010不支持它们,我不相信。实际上,boost::tuple可能是同一想法的一个更易于访问的版本。有一个通用的模板和一种类型,然后专门的版本与元组为二,三,四。。。类型。