簡體   English   中英

將任意 lambda 表達式傳遞給函數?

[英]Passing an arbitrary lambda expression to a function?

我有一個非常奇特的問題,因為我正在嘗試創建某種編譯器......我想將 lambda 表達式傳遞給這樣的模板化函數:

    template<class T>
delegate<T>* bind(std::function<T> func)
{
    return nullptr;
}

所以我現在可以打電話

bind([&](int a) { // do something });

...所以通常情況下,這不會成為問題,因為 std::function 能夠捕獲 lambda。 但這里的問題是(讓我們假設)我不知道或不想提供有關“T”究竟是什么的信息。 它可以是任何函數簽名,您也可以插入 std::function<>...

我還需要將此“推斷”簽名傳遞回我要返回的“委托”類,並且該委托類需要是指向類的指針...

現在我想出了這個:

template<class T>
struct delegate : public std::function<T>
{
    delegate(const std::function<T>& func) : std::function<T>(func) { }
    delegate(const delegate<T>& func) { }
};

template<class T>
delegate<T>* bind(std::function<T>&& func)
{
    return new delegate<T>(std::forward<std::function<T>>(func));
}

但是上面調用“bind”的例子因“模板參數推導失敗”而失敗。 如何在調用“bind”時無需顯式指定“T”參數即可使其正常工作(至少它可以工作)?

由於理論上我的編譯器具有解決此問題的所有信息,因此我可以插入“T”的實例,但這會使生成的代碼不必要地復雜化。

順便說一句,我正在使用最新的 Clang 編譯器。


這是最終的解決方案:

    template<typename T> struct get_signature;
template<typename Mem, typename Ret, typename... Args> struct get_signature<Ret(Mem::*)(Args...) const> {
    typedef Ret type(Args...);
};

template<class T> 
delegate<typename get_signature<decltype(&T::operator())>::type>* bind(T func)
{
    return nullptr;
}

請注意,您可能需要根據需要調整“const”修飾符。

首先,您已經完全搞砸了右值引用。 您的轉發根本不起作用。

其次,在某些情況下這是不可能的。對於某些函數對象,您可以通過將成員函數指針指向operator()並檢查其簽名來推斷簽名。 但對於其他人來說,它們會超載而無法正常工作。

template<typename T> struct get_signature;
template<typename Mem, typename Ret, typename... Args> 
struct get_signature<Ret(Mem::*)(Args...)> {
    typedef Ret(Args...) type;
};

template<class T> 
delegate<typename get_signature<&T::operator()>::type>* bind(T func)
{
    return nullptr;
}

第三, std::bind

暫無
暫無

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

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