如何通过子类型列表创建指针向量
How to make a pointer vector by a list of sub types?
我有一个基类型B和它的子类型列表,比如B1, B2,它们都是从B派生出来的。我想开发一个函数来创建一个指针向量,它的元素是新的B1,新的B2,等等,比如
template<class BaseType, class... SubTypes>
vector<unique_ptr<BaseType>> makePtrVector()
{
vector<unique_ptr<BaseType>> v;
v.emplace_back(new SubTypes)...; // error, SubTypes has to be expanded
return v;
}
我尝试了上面的代码,但失败了。我不清楚参数包的扩展。有什么方法来纠正它或它只是一个编译器的错误? 只能在特定上下文中进行参数包展开。完整语句级别不在其中。
std::vector::emplace_back
返回void
,所以我们可以这样做:
struct empty {};
template<class BaseType, class... SubTypes>
vector<unique_ptr<BaseType>> makePtrVector() {
vector<unique_ptr<BaseType>> v;
empty unused[]= {(v.emplace_back(new SubTypes), empty{})..., empty{}}; // error
return v;
}
,其中我们创建了empty
类型的初始化列表,作为其构造的副作用,调用您喜欢的代码。(int
也很流行)。
另一种方法是将其移动到辅助函数中。然而,这并不适用于每个编译器:
template<typename...Fs>
void do_in_order( Fs&&... fs ) {
empty unused[]= { (void( std::forward<Fs>(fs) ), empty{})..., empty{} };
}
然后在你的代码中:
template<class BaseType, class... SubTypes>
vector<unique_ptr<BaseType>> makePtrVector() {
vector<unique_ptr<BaseType>> v;
do_in_order( [&]{ v.emplace_back(new SubTypes); }... );
return v;
}
哪个看起来不那么钝,不是吗?缺点是一些主要的编译器不喜欢lambda中不完整的参数包,这些参数包只在lambda的右括号结束后展开。
相关文章:
- 如何创建指针链?我想创建具有指向更多对象的指针的对象,该对象具有指针.这可能吗?
- c++ 获取非语法使用"&"创建指针
- 在自定义构造函数中的堆上创建指针
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 创建指针会占用大量资源吗?
- 创建指针时是否没有构造函数调用
- 以不寻常的方式创建指针
- 在类中创建指针到另一个对象
- Visual Studio 2015"非标准语法;使用"&"为成员创建指针"
- 创建指针 C++ 时获取段错误
- 当我在 c++ 中创建指针数组时无法读取的内存
- 创建指针列表的正确范例是什么
- 如何在C 11中创建指针映射以静态成员功能
- 奇怪的错误:当没有真正创建指针时,使用已删除的函数'std::unique_ptr<_Tp,_Dp>::unique_ptr
- 如何使用双指针创建指针数组?
- 创建指针数组
- C++:创建指针的副本
- 使用new创建指针数组,这样指针就不会初始化为NULL
- 如何在不从参数列表中创建对象的情况下创建指针
- 如何在定义后创建指针和结构实例