【发布时间】:2015-05-17 06:11:06
【问题描述】:
我有兴趣编写一个 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 */);
}
它很罗嗦,但并不难理解,而且可以编译。
我想也许我可以用std::declval 和std::remove_reference 做类似的事情,但我无法编译。反正不会比上面的干净多少。
C++14 是否提供任何非偷偷摸摸的方式来将 SpecialThing 类型转换为 createThing 这里?或者失败了,一个比我的 nullptr 技巧更好的偷偷摸摸的方法?
(注意:我知道我可以通过其他方式解决这个问题;我只是要求学习该语言,而不是为了克服严重的障碍。因此,上面的愚蠢代码简单地包装了一个标准函数,没有明显原因。)
【问题讨论】:
标签: c++ templates lambda c++14