C++ 如何创建函数列表<&燃气轮机;类来保存std::function的向量<&燃气轮机;是否使用相同的模板语法?

C++ 如何创建函数列表<&燃气轮机;类来保存std::function的向量<&燃气轮机;是否使用相同的模板语法?,c++,c++11,templates,delegates,std-function,C++,C++11,Templates,Delegates,Std Function,我希望有一个function_list模板类,它保存std::function值的向量。关键的一点是,我想用与声明单个std::函数相同的形式声明我的列表。e、 g 函数\u列出函数;//获取并返回void的std::函数列表 下面是我实现这一点的尝试。我试图遵循标准库的函数头文件中std::function模板使用的相同语法 #include <functional> #include <vector> #include <iostream> templ

我希望有一个function_list模板类,它保存std::function值的向量。关键的一点是,我想用与声明单个std::函数相同的形式声明我的列表。e、 g

函数\u列出函数;//获取并返回void的std::函数列表
下面是我实现这一点的尝试。我试图遵循标准库的函数头文件中std::function模板使用的相同语法

#include <functional>
#include <vector>
#include <iostream>

template<class _R, class... _Args>
class function_list<_R(_Args...)>
{
public:
  std::vector<std::function<_R(_Args...)>> functions;
  function_list& operator+=(std::function<_R(_Args...)> f) { functions.push_back(f); return *this; }
  void call_all(_Args... args) { for (auto& f : functions) { f(args...); } }
};

int main()
{
  function_list<void()> fl;
  fl += []() { std::cout << "Hello, World!" << std::endl; };
  fl += []() { std::cout << "Goodbye, Cruel World!" << std::endl; };

  fl.call_all();

  return 0;
}
#包括
#包括
#包括
样板
类函数列表
{
公众:
向量函数;
函数列表和运算符+=(std::函数f){functions.push_back(f);返回*this;}
void调用所有(_Args…Args){for(auto&f:functions){f(Args…;}}}
};
int main()
{
功能列表fl;

fl+=[](){std::cout我不明白直接使用
std::vector
有什么不对,但下面是你的答案:

模板类函数\u列表
这里有一个类模板专门化

但您需要先声明模板才能对其进行专门化:

模板类功能列表;

但事实上,你甚至不需要特殊化。你可以简单地做到:

模板类函数\u列表
{
公众:
向量函数;
};


另请注意,以
\uuuuu
开头并后跟大写字母的名称是保留的,不得使用。您应该重命名模板参数。请参见我不明白直接使用
std::vector
有什么错,但下面是您的答案:

模板类函数\u列表
这里有一个类模板专门化

但您需要先声明模板才能对其进行专门化:

模板类功能列表;

但事实上,你甚至不需要特殊化。你可以简单地做到:

模板类函数\u列表
{
公众:
向量函数;
};


还要注意的是,以
\uu
开头,后跟大写字母的名称是保留的,不得使用。您应该重命名模板参数。请参见非常感谢您的快速回复。您是正确的-一旦我首先创建了一个空类模板,然后是我的类模板专用化,我的代码就会正确编译.我需要专门化,因为我想添加另一个方法,该方法将使用正确的参数调用列表中的所有函数。为了简单起见,我省略了该方法,但我现在将其添加到OP中。最后,感谢您提供关于[a-Z]的提示保留名称,我认为复制标准库约定是正确的,但显然不是。再次感谢!噢,std::vector不够,因为我要添加运算符+=(std::function)重载委托语法。非常感谢您的快速回复。您是正确的-一旦我首先创建了一个空的类模板,然后是我的类模板专门化,我的代码就可以正确编译。我需要专门化,因为我想添加另一个方法,该方法将使用正确的参数调用列表中的所有函数。我为了简单起见,我将把它添加到OP中。最后,感谢关于保留[A-Z]名称的提示,我认为复制标准库约定是正确的,但显然不是。再次感谢!哦,std::vector还不够,因为我要添加一个运算符+=(std::function)委托语法的重载。
#include <functional>
#include <vector>
#include <iostream>

template<class _R, class... _Args>
class function_list<_R(_Args...)>
{
public:
  std::vector<std::function<_R(_Args...)>> functions;
  function_list& operator+=(std::function<_R(_Args...)> f) { functions.push_back(f); return *this; }
  void call_all(_Args... args) { for (auto& f : functions) { f(args...); } }
};

int main()
{
  function_list<void()> fl;
  fl += []() { std::cout << "Hello, World!" << std::endl; };
  fl += []() { std::cout << "Goodbye, Cruel World!" << std::endl; };

  fl.call_all();

  return 0;
}
test.cpp:6:7: error: explicit specialization of non-template class 'function_list'
class function_list<_R(_Args...)>
      ^            ~~~~~~~~~~~~~~
test.cpp:9:28: error: function cannot return function type 'void ()'
        std::vector<std::function<_R(_Args...)>> functions;
                                  ^
test.cpp:14:24: note: in instantiation of template class 'function_list<void ()>' requested here
        function_list<void()> fl;
                              ^
2 errors generated.