gpt4 book ai didi

c++ - 将类型名称传递给 lambda 的最简洁方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:51 24 4
gpt4 key购买 nike

我有兴趣编写一个 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::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 */);
}

关于c++ - 将类型名称传递给 lambda 的最简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30283913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com