簡體   English   中英

將類型名稱傳遞給lambda的最干凈方法是什么?

[英]What's the cleanest way to pass a typename into a lambda?

我對編寫lambda函數感興趣,該函數除其他外將調用std::make_unique 調用std::make_unique我需要一個類型名,但是為了將類型名直接傳遞給lambda函數,我似乎必須將lambda變量作為模板:

struct SpecialThing
{
    SpecialThing(/* some arguments */) {}
}

void f()
{
    template <typename Thing>
    auto createThing = [](auto&&... parameters)
    {
        return std::make_unique<Thing>(std::forward<decltype(parameters)>(parameters)...);
    };

    auto thing = createThing<SpecialThing>(/* some construction parameters */);
}

但是我的編譯器(GCC 4.9.2)似乎不喜歡這樣。 (雖然我對模板變量知之甚少,但我不確定它不會,但我並沒有真正想到它。)

假設我真的確定要保留createThing為lambda函數類型的局部變量。 我該如何干凈地包裝std::make_unique 這是我到目前為止所取得的最好成績:

void f()
{
    auto createThing = [](auto dummyThingPointer, auto&&... parameters)
    {
        typedef typename std::remove_pointer<decltype(dummyThingPointer)>::type Thing;
        return std::make_unique<Thing>(std::forward<decltype(parameters)>(parameters)...);
    };

    auto thing = createThing(static_cast<SpecialThing*>(nullptr), /* some construction parameters */);
}

它有點羅word,但並不是很難理解,並且可以編譯。

我想也許我可以用std::declvalstd::remove_reference做類似的事情,但是我無法編譯。 無論如何,它不會比上面更干凈。

C ++ 14是否提供任何非偷偷摸摸的方法來將SpecialThing類型放入此處的createThing 還是失敗了,這比我的nullptr技巧更好的偷偷摸摸的方法?

(注意:我知道我可以通過其他方法解決此問題;我只是在要求了解該語言,而不是要克服嚴重的障礙。因此,上面的愚蠢代碼沒有明顯的理由就瑣碎地包裝了一個標准函數。)

我會使用標記類型:

#include <memory>
struct SpecialThing
{
    SpecialThing(/* some arguments */) {}
};
template<typename T>
struct Tag {
    typedef T type;
};
void f()
{
    auto createThing = [](auto typeTag, auto&&... parameters)
    {
        return std::make_unique<typename decltype(typeTag)::type>(
                        std::forward<decltype(parameters)>(parameters)...);
    };

    auto thing = createThing(Tag<SpecialThing>{} /*, some construction parameters */);
}

暫無
暫無

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

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