簡體   English   中英

不能通過模板化函數或auto關鍵字推導Lamba類型

[英]Lamba type is not being deduced by templated function or auto keyword

我在理解這一點時遇到了很多麻煩。 我知道我的編譯器(Visual Studio)知道lambda是什么“類型”,因為有時它表明它是lambda,但是我的模板沒有推斷出它,auto關鍵字也沒有。

template <typename T> void templatedFunc(T (*funcPtr)(void)) { }

int main()
{
    templatedFunc([] () { return 6;} );     // Error, no template matches argument list

    int (*funcPtr)(void) = [] () { return 6;};
    templatedFunc(funcPtr);                 // Works fine

    auto p = [] () { return 6; };
    templatedFunc(p);                       // Error, no template matches

    auto p = [] () -> int { return 6; };    // Trying with explicit return type
    templatedFunc(p)                        // Error, still doesn't work
}

我真的不明白,任何幫助都會很棒。 當我將鼠標懸停在變量“ p”上時,它的類型顯示為int()。 我做這項工作的唯一方法是顯式聲明一個指針,如:

int (*ptr) (void) = [] () { return 6;};

我不斷得到的錯誤是:

No instance of function template matches the argument list. Argument types are lambda []int () -> int

謝謝。

閉包對象(適當類型)可以隱式轉換為函數指針類型,但它本身不是函數指針。 模板參數推導不考慮隱式轉換; 您所擁有的東西不是與您的功能模板簽名相匹配的模式。

第一個代碼示例有效,因為要提前執行到函數指針的轉換。

編寫接受可調用函數模板的更好方法是根本不使用函數指針,而是對可調用對象本身進行參數化:

template <typename T> void templatedFunc(T f) { f(); }

您可以使用unary +將無狀態lambda強制轉換為函數指針,然后將其與函數模板匹配:

templatedFunc(+[] () { return 6; });

此代碼生成的對象的類型:

[] () { return 6;}

是一個名字無法說出的課程(為了紀念年輕人,我們將其稱為“ Ftoompsk”)

這: T (*funcPtr)(void)是一個非常明確的對象類型-它是指向接受空值並返回T的函數的指針。

由於“ Ftoompsk”不捕獲任何變量,因此可以將其轉換為函數指針。 但是,在模板自變量推導過程中不會進行此轉換。

您可以通過以下方式強制轉換:

auto p = +[] () { return 6; };
templatedFunc(p);

因為一元加號會導致在推導參數之前進行轉換。 但是,這是一個可怕的駭客,一旦修改lambda以捕獲參數,它就會失敗。

接受克雷克的建議。 如圖所示重構templatedFunc。

暫無
暫無

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

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