![](/img/trans.png)
[英]What's the cleanest way to walk and unwalk a std::vector using iterators?
[英]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::declval
和std::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.