C++ 转换为C++;未捕获lambda无效*

C++ 转换为C++;未捕获lambda无效*,c++,lambda,C++,Lambda,我有一个带参数的回调小类 template<typename Ret, typename ...Args> class Callback { public: typedef Ret (*Ptr)(Args..., void* param); Ptr m_func; void* m_param; void setFunc(void* func) { m_func = (Ptr)func; } template<typename T>

我有一个带参数的回调小类

template<typename Ret, typename ...Args>
class Callback
{
public:
    typedef Ret (*Ptr)(Args..., void* param);
    Ptr m_func;
    void* m_param;
    void setFunc(void* func) { m_func = (Ptr)func; }
    template<typename T>
    void setFunc(const T& func) { m_func = (Ptr)func; }
};
但对于非捕获lambda,我只能将其用于严格的void类型:

callback.setFunc([](..., void* param) { ... });

我可以将lambda转换为它的指针,但是我应该编写它的typedef和cast,虽然我希望setFunc接受带有任何参数类型的lambda,而不需要在回调类之外进行额外的转换,但我能以某种方式做到吗?谢谢。

我相信这样做应该会奏效:

模板
类回调
{
公众:
模板
使用Ptr=Ret(*)(Args…,T*param);
Ptr m_func;
参数*m_参数;
模板
void setFunc(Ptr func){m_func=(Ptr)func;}
};
工作副本:


但是,您应该知道,在不将m_func强制转换回正确类型的情况下使用m_func是错误的。虽然可以按您的要求执行,但这种类型的强制转换和对UB的依赖通常是代码需要重构的标志。这可能是一个错误。为了获得更合适的解决方案,您必须解释为什么希望回调的单个实例中的m_参数指向不同的类型。

为什么
func
param
std::function
?用户可以使用
std::bind
传递自定义回调数据。我不能使用std::function,因为它太重了…这就是全部。您可以强制转换函数指针,但必须在调用之前将其强制转换回。在您的类中,您丢失了原始类型,因此没有可转换的对象。正如我前面所说的,即使在一个回调中,参数也可能具有不同的类型…更新以修复问题这是UB,因为您调用的函数的指针已转换为不同的类型。您需要有一个回退的适配器<代码>void(*m_invoker)(Ptrfunc,Args…,void*param)并使用类似于
m_invoker=[](Ptr func,Args…Args,void*param){((Ptr)func)(Args…,(T*)param);}
`基本上,我们所做的是创建一个非常专业化的
std::function
@RaymondChen版本,我假设他在使用函数的时候有某种方式执行强制转换。但是,您的答案是UB,如果有机会,我会用额外的信息更新我的答案。因为示例传递了lambda表达式,调用方无法回溯,因为类型丢失。
callback.setFunc([](..., void* param) { ... });