gpt4 book ai didi

C++将函数模板作为参数传递给其他函数作为回调

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:04 26 4
gpt4 key购买 nike

我有一个如下的函数:

template<typename... Args>
int
error_handler (const char *format, Args&... args)
{
// deal with the information passed
}

我正在编写一个库,它在初始化期间接受这样一个函数指针,因此库可以在发生某些事情时将其作为回调调用。但是,我无法编写这样的 API。我尝试了以下但编译器不喜欢它:

void init(template<typename... Args> int (*error_handler_cb)(const char *format, Args&... args));

这里是错误:

error: expected identifier before 'template'
void init(template<typename... Args> int (*error_logger_cb)(const char *format, Args&... args),
^~~~~~~~
libapi.hpp:20:22: error: expected ',' or '...' before 'template'

有人可以帮我克服这个问题吗?

最佳答案

您不能将类型作为函数参数传递,只能传递一个值。您可以通过只需要一个仿函数来利用 init 上的约束:

template<typename F>
void init(F f)
{
// ...
}

如果你需要存储f以便稍后调用它,std::function可能是一个选项:

namespace {
std::vector<std::function<int(void)>> init_functions;
}

template<typename F>
void init(F f)
{
init_functions.push_back(f);
}

一个完整的实现可能是这样的:

namespace {
std::vector<std::function<int(void)>> init_functions;
}

template<typename... Args>
int
error_handler (const char *format, Args&&... args)
{
do_something(format);
do_something(args...);

return 0;
}

template<typename F>
void init(F f)
{
init_functions.push_back(f);
}

int main()
{
auto f = []() {
return error_handler("test", 4, 2);
};
init(f);
return init_functions[0]();
}

请注意在 error_handler 中使用右值引用,而不是像您那样使用左值引用。这允许在 main 函数中传递右值。

查看 live example在 rextester 上。

关于C++将函数模板作为参数传递给其他函数作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47917581/

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