如何使用相同的模板语法创建 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
我希望有一个 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