C++模板化的回调反弹函数
C++ templated callback bounce function
我一直在尝试开发一个模板化函数,该函数在处理使用函数指针回调的C API时概括了反弹过程。
我基本上已经想好了,并且有一个工作系统,但我想知道是否有办法清理最后一步。
假设您有一个API,它接受一个函数指针和一个用户数据指针。您希望使用实例方法作为回调目标。这需要一个"反弹"函数,该函数将用户数据指针重新解释为实例指针,并使用其余参数调用该方法。
以下示例代码有效:
#include <cstdio>
class Foo {
public:
Foo(int val) : val_(val) { }
void baz(int v) const
{
printf("baz %dn", v + val_);
}
private:
int val_;
};
// Templated bounce function
template<class T, class Method, Method m, class Ret, class ...Args>
static Ret bounce(void *priv, Args... args)
{
return ((*reinterpret_cast<T *>(priv)).*m)(args...);
}
#define BOUNCE(c, m) bounce<c, decltype(&c::m), &c::m>
// Callback simulator
void call_callback(void (*func)(void *, int), void *priv, int v)
{
if (func) {
func(priv, v);
}
}
// Main Entry
int main()
{
Foo bar(13);
call_callback(&bounce<Foo, decltype(&Foo::baz), &Foo::baz>, &bar, 10);
call_callback(&BOUNCE(Foo, baz), &bar, 11);
return 0;
}
基本上,我正在寻找一种清理使用情况的方法。宏是有效的,但我正试图找到某种类型的辅助函数,它只需要像&Foo::baz
这样的方法指针参数,就可以推导出所有参数。类似于bounce_gen(&Foo::baz)
的东西,它会返回一个指向实际反弹函数的指针。
这是一个有趣的练习,但我没能完全完成最后一部分。
成员函数指针的类型包含类类型和函数签名。因此,您可以让模板函数参数推导为您处理此问题:
template<class T, class Method, class ...Args>
static auto bounce(Method T::*func, T* priv, Args... args) -> decltype((priv->*m)(args...))
{
return (priv->*m)(args...);
}
更方便的方法可能是使用std::bind
或lambda来完全隐藏它是成员函数调用的事实:
template<class Func, class ...Args>
static auto bounceCallable(Func func, Args... args) -> decltype(func(args...))
{
return func(args...);
}
你可以这样称呼它:
call_callback([&bar](int v){bar.baz(v);}, 11);
使用lambda,您的语法比使用std::bind
更好,但这是以必须重复签名为代价的。
相关文章:
- 以特征类型作为参数的泛型函数回调
- C# DllImport 调用非托管C++函数回调
- 为什么模板参数推导失败,std::函数回调的可变参数模板参数?
- std::包含 std::函数回调的多个包装器的向量不起作用
- 如何设置对类的私有函数的函数回调?
- 如何使用 c++11 函数回调声明多个模板参数
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- Windows表单如何使用其他函数回调图表信息
- 如何在 c++ 结构中的 void* 变量中调用存储函数(回调)
- 将成员函数作为标准函数回调
- C++ 使用成员函数回调实现按钮
- std::函数回调,参数采用观察者模式(寄存器主题上的占位符)
- 使用可变参数模板从 Lua 函数回调 (C api) 中提取参数
- 在C++中使用派生类的静态方法作为函数回调
- 将libuv与函数结构一起使用,而不是函数回调
- 如何将函数回调传递给类成员
- c++类成员函数回调
- C++函数回调:无法从成员函数转换为函数签名
- 如何编写一个通用函数回调测试类