gpt4 book ai didi

c++ - 如何通过子类型列表制作指针 vector ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:29 26 4
gpt4 key购买 nike

我有一个基本类型 B 和它的子类型列表,例如从 B 派生的 B1、B2。我想开发一个函数来创建一个包含新 B1、新 B2 等元素的指针 vector ,喜欢

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;
}

我们在其中创建一个类型的初始化列表,作为其构造的副作用,调用您喜欢的代码。 (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++ - 如何通过子类型列表制作指针 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23704399/

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