将类型名传递到 lambda 的最干净方法是什么?
What's the cleanest way to pass a typename into a lambda?
我有兴趣编写一个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 */);
}
但是我的编译器(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技巧更好的鬼鬼祟祟的方法?
(注意:我知道我可以用其他方法解决这个问题;我只是要求学习语言,不是为了克服一个严重的障碍。因此,上面的愚蠢代码毫无理由地简单地包装了一个标准函数。)
我将使用一个标签类型:
#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 */);
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?