将typename传递给lambda最简洁的方法是什么?

mjw*_*ach 2 c++ lambda templates c++14

我有兴趣编写一个lambda函数,除其他外,它将调用std::make_unique.要调用std::make_unique我需要一个typename,但似乎为了直接将typename传递给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 */);
}
Run Code Online (Sandbox Code Playgroud)

但我的编译器(GCC 4.9.2)似乎并不喜欢这样.(我并没有真正期待它,虽然我对模板变量知之甚少,但我不能确定它不会.)

假设我真的决定保留createThinglambda函数类型的局部变量.我能以多么干净的方式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 */);
}
Run Code Online (Sandbox Code Playgroud)

它是罗嗦的,但它并不是很难理解,它编译.

我想也许我可以做类似的事情std::declval,std::remove_reference但我无法编译.无论如何,它不会比上面更清洁.

C++ 14是否提供了任何非偷偷摸摸的方式来获取SpecialThing类型createThing?或者失败了,一种比我的nullptr技巧更好的偷偷摸摸的方式?

(注意:我知道我可以通过其他方式来解决这个问题;我只是想要了解语言,而不是克服严重的障碍.因此,上面的愚蠢代码可以毫无理由地包含标准函数.)

Man*_*rse 5

我会使用标签类型:

#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 */);
}
Run Code Online (Sandbox Code Playgroud)