Eos*_*ern 8 c++ function-pointers variadic-functions std-function
我有一个结构,我传递给我的应用程序,其中包含一堆回调函数:
typedef struct {
std::function<void (void)> f1;
std::function<void (int)> f2;
std::function<int (float *)> f3;
// ... and so on
} CallbackTable;
Run Code Online (Sandbox Code Playgroud)
我通过将不同的函数绑定到各种回调来处理应用程序中的状态控制,具体取决于当前的系统状态; 它工作正常.
我现在要做的是添加一些带有包含可变数量参数的签名的额外回调,类似于printf:例如,
std::function<int (const char * format, ...)> printToStdOut;
Run Code Online (Sandbox Code Playgroud)
这不起作用.在Visual C++中,我收到一条错误消息,指出:
error C2027: use of undefined type 'std::_Get_function_impl<_Fty>'
Run Code Online (Sandbox Code Playgroud)
我仍然在感受这个C++语法领域,并且非常感谢我对如何从这里开始的任何建议.我的首要目标是能够按以下方式拨打电话:
myCallbackTable.printToStdOut("I've just eaten %d bananas\r\n", nBananas);
Run Code Online (Sandbox Code Playgroud)
...并根据系统状态将输出定向到控制台,文件或GUI窗口.
编辑:原始答案是错误的,修改但仍然可能不是一个好的答案,留在这里用于教育目的:
许多变量参数函数都有va_list版本.printf例如有vprintf.这些变体明确地采用va_list而不是省略号.
#include <iostream>
#include <functional>
#include <cstdarg>
int main()
{
std::function<int(const char*,va_list)> test2(vprintf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,调用它是一种痛苦.
int invoke_variadic(const std::function<int(const char*,va_list)>& ref,const char* a ,...)
{
va_list args;
va_start(args,a);
ref(a,args);
va_end(args);
}
Run Code Online (Sandbox Code Playgroud)
原帖(感谢/ u/TC)出了什么问题:std::function<int(const char*,va_list)> test2(printf)编译,我认为这意味着"工作".但是它编译是因为printf可以接受任何类型的参数(包括va_list),并且std::function只检查它是否可以以这种方式调用.
| 归档时间: |
|
| 查看次数: |
2706 次 |
| 最近记录: |