簡體   English   中英

將 C++ 非捕獲 lambda 轉換為 void*

[英]Convert C++ non-capturing lambda to void*

我有一個帶參數的回調類

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; }
};

“param”成員是一個空指針,但它實際上可能指向不同的結構,即使在一個回調的上下文中所以我可以使用 setFunc 和這樣的簡單函數:

void func1(..., ExampleContext* param) { ... }
callback.setFunc(func1);

但是對於非捕獲 lambda,我只能將它與嚴格的 void 類型一起使用:

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

我可以將 lambda 轉換為它的指針,但我應該編寫它的 typedef 和強制轉換,而我希望 setFunc 接受具有任何參數類型的 lambda,而無需在 Callback 類之外進行額外的轉換,我能以某種方式做到嗎? 謝謝你。

我相信這樣的事情應該有效:

template<typename Ret, typename Param = void, typename ...Args>
class Callback
{
public:
    template<typename T = Param>
    using Ptr = Ret (*)(Args..., T *param);
    Ptr<> m_func;
    Param *m_param;
    template<typename T = Param>
    void setFunc(Ptr<T> func) { m_func = (Ptr<>)func; }
};

工作副本: https ://ideone.com/amapu0

但是,您應該知道使用 m_func 而不將其轉換回正確的類型是 UB。 雖然可以按照您的要求進行操作,但這種類型的轉換和對 UB 的依賴通常表明您的代碼需要重構。 這可能是一個xy 問題 為了獲得更合適的解決方案,您必須解釋為什么您希望單個 Callback 實例中的 m_param 指向不同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM