gpt4 book ai didi

c++ - 如何创建一个 function_list<> 类来保存具有相同模板语法的 std::function<> vector ?

转载 作者:行者123 更新时间:2023-11-30 01:02:11 28 4
gpt4 key购买 nike

我希望有一个包含 std::function<> 值 vector 的 function_list<> 模板类。一个关键点是我想用与声明单个 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...)>

这就是类模板特化。

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

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

关于c++ - 如何创建一个 function_list<> 类来保存具有相同模板语法的 std::function<> vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56619149/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com