【发布时间】:2017-12-15 19:14:38
【问题描述】:
sd-bus 在定义 d-bus 方法时需要一个回调函数。当我在做 C++14 时,我希望对类对象 on_msg_method_here() 函数进行这些调用。我想要实现的是这样的(在伪 C++ 中):
int callback_dbus_method_foo( message* msg, void* userdata, ... )
{
MyClass* cls = (MyClass*)userdata;
Type0 var0;
if ( message_process( msg, signature[0], &var0 ) != 0 )
//.. error here
Type1 var1;
if ( message_process( msg, signature[1], &var1 ) != 0 )
//.. error here
//... and these continue from 0 to N
TypeN varN;
if ( message_process( msg, signature[N], &varN ) != 0 )
//.. error here
int dbus_ret = cls->on_msg_method_foo( var1, var2, ..., varN )
handle_dbus_ret( msg, dbus_ret // ... );
return 0;
}
int MyClass::register_callbacks( ... )
{
// Well really we have something really different, this is to demonstrate
// pass 'this' as userdata* to callback function
dbus_register_callback( "method_foo",
&callback_dbus_method_foo, this )
}
现在我知道我可以使用 C 宏来做到这一点,但是如何正确地 使用 C++14 可变宏来做到这一点?
据我了解,调用某个类对象某个方法的麻烦可以用 std::bind 处理(并通过 userdata 指针传递),变量声明和 message_process 可以用可变参数模板剥离来完成,但是如何让那些声明的变量(伪代码示例中的 var0、var1、..)正确扩展为调用?简而言之,如何做到这一点:
MyClass::register_callbacks()
{
Mystic fun_to_call = std::bind( &MyClass::on_dbus_method_foo, this );
dbus_register_callback( "method_foo",
super_magic_template<int,double,bool>, &fun_to_call );
}
【问题讨论】:
-
注册本地函数的地址不会让你特别远:调用
fun_to_call时,你将访问一个被破坏的对象。您需要保留已注册的对象。我对 sd-bus 了解不多,无法评论如何给它一个更好的 C++ API。
标签: c++ c++11 c++14 variadic-templates dbus