如何使用相同的模板语法创建 function_list<> class 来保存 std::function<> 的向量?

How do I create a function_list<> class to a hold a vector of std::function<>s with the same template syntax?

我希望有一个 function_list<> 模板 class,其中包含 std::function<> 值的向量。关键是我想用与声明单个 std::function<> 相同的形式来声明我的列表。例如

function_list<void()> functions; // list of std::functions that take and return void

下面是我尝试实现的。我尝试遵循标准库的 functional 头文件中 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;
}

这不会编译并失败并出现以下错误(OSX 10.14 上的 clang):

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.

我做错了什么?感谢您的帮助。

我不明白直接使用 std::vector<std::function<...>> 有什么问题,但这是你的答案:

template<class _R, class... _Args> class function_list<_R(_Args...)>

这右边有一个 class 模板专业化。

但是你需要先声明一个模板才能特化它:

template <class> class function_list;

但实际上您甚至不需要专业化。你可以简单地做:

template <class T> class function_list
{
  public:
    std::vector<std::function<T>> functions;
};

另请注意,以 _ 开头后跟大写字母的名称是保留名称,不得使用。您应该重命名模板参数。参见 https://en.cppreference.com/w/cpp/language/identifiers