回调未知的类+函数
Callback an unknown class+function
我的C++已经生锈了。我希望MyClass对Foo一无所知,并有一个回调来运行Foo中的函数。我不知道如何定义callback_pair或如何调用SetCallback
class MyClass{
tuple<cb, ptr> callback_pair
int run() {
auto that=callback_pair<1>();
auto cb = callback_pair<0>();
int a=1, b=2, c=3;
auto result = cb(that, a, b, c); //this calls foo.the_function
return result;
}
void SetCallback(tuple<cb, ptr> cb) { callback_pair=cb; )
};
class Foo {
int d;
int the_func(int a, b, c) {
return a+b+c+d
}
}
//myclass.SetCallback(what_do_I_write_here)
好吧,MyClass
必须知道关于Foo
的一些,即您计划用作回调的任何方法的签名;否则,它怎么知道什么作为参数传入,或者期望得到什么类型的输出?如果回调签名是已知的并且是固定的,例如上面的int(int,int,int)
,那么可以使用这样的构造:
class MyClass {
std::function<int(int,int,int)> callback;
public:
int run() {
return callback(1,2,3); // or whatever
}
template <typename Class>
void SetCallback (Class& o, int (Class::*m) (int,int,int)) {
callback = [&o,m] (int a, int b, int c) { return (o.*m)(a,b,c); };
}
template <typename Class>
void SetCallback (Class const& o, int (Class::*m) (int,int,int) const) {
callback = [&o,m] (int a, int b, int c) { return (o.*m)(a,b,c); };
}
};
MyClass
的上述实现如下:callback
是一个函数对象,最初未定义,它占用三个int
,并返回一个int
。SetCallback
采用两个参数:应该对其执行回调的对象o
和符合callback
签名的该对象上的方法m
。它不在乎o
的类型是什么;由于类型擦除,MyClass
永远不需要知道它实际在调用什么。
请特别注意SetCallback
的两个版本——分别用于const
和非const
对象。实际上,您也应该为volatile
和const volatile
编写重载,但这些重载比const
要少得多。在未来,一旦异常规范和事务成为类型系统的一部分,我们还必须关心noexcept
和同步,如果没有一些非常聪明的语言支持,由此产生的类型组合爆炸将很难有效处理。但这个例子向您展示了这类代码是如何编写的,对于您的目的来说,它可能已经足够好了。
实现看起来很难看,但实际上它提供了一个非常干净的接口;给定如上所述的Foo
,您将使用MyClass
的回调功能,如下所示:
MyClass test;
Foo foo;
foo.d = 4;
test.SetCallback (foo, &Foo::the_func);
int result = test.run(); // result = 10
上面的代码将适用于任何具有签名为int(int,int,int)
的方法的类型。请注意,在调用run
之前,必须先调用SetCallback
,否则会出现std::bad_function_call
异常,因为回调尚未定义。
- 双链表的擦除值函数,未知错误
- 在带有模板的函数中传递未知大小的 std::数组.如何更正此代码?
- 如何创建参数数量未知的函数?
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 线程 std::调用未知类型,无法专门化函数错误
- 参数数据类型未知的可变参数函数
- 通过模板函数对未知类型调用方法
- 在回调中使用函数时,C++未知重写说明符
- 在库的未知类中调用函数
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 如何获取指向未知重载函数的任何重载的指针?
- 在 C++ 的模板函数中初始化自动(未知)类型的向量
- GCC 升级导致模板函数的静态局部变量变得未知
- 使用来自C++的任意数量的参数(在编译时未知)调用 Python 函数
- 将向量项传递给具有未知数量参数的函数对象
- 构造函数初始化器列表中未知长度的数组
- Qtcpserver 仅在调试器下在侦听函数上返回未知错误
- C++传递指向未知大小的数组的指针,函数大小并填充它
- 模板函数的返回类型未知,使用 decltype 时代码重复
- 如何将lambda函数传递到具有未知类型和未知参数的构造函数