gpt4 book ai didi

c++ - 用于将 unique_ptr 的 vector 初始化为基类型的可变参数构造函数

转载 作者:行者123 更新时间:2023-11-30 02:35:20 25 4
gpt4 key购买 nike

下面是一个示例程序,其中“容器”类需要通过基类指针存储“项目”列表。从 C++11/14 开始,在我的情况下,自然的选择是使用 std::unique_ptr 和可变参数模板。

但是作为新手,我无法理解如何以编译的方式将可变参数列表转换为 unique_ptr vector 的初始化列表。非常感谢帮助,因为到目前为止我未能在网上找到任何可以帮助我解决这个问题的东西(尽管可能在那里!)。

提前致谢:

// Example program
#include <iostream>
#include <string>
#include <memory>
#include <vector>

struct Item
{
};


struct Container
{
template<typename... Items>
Container( Items&&... items )
: items_( {std::make_unique<Items>(items)...} ) //<<TODO: How, VC compiler times out with this code!?
{
}

std::vector<std::unique_ptr<Item>> items_;
};

struct A : Item { A(float){} };
struct B : Item { };
struct C : B { C(float){} };
struct D : Item { D(float){} };

int main()
{
Container x( A(1), C(2), D(3) );

return 0;
}

最佳答案

问题是您不能将 unique_ptrintializer_list 移出。阅读this question了解更多详情。

此解决方案使用 this answer 中的技术您可以使用普通数组来构造项目,而不是使用 intializer_list

struct Container
{
template<typename... Items>
Container( Items&&... items )
: items_()
{
std::unique_ptr<Item> itemArr[] = {std::make_unique<Items>(std::move(items))...};
items_ = std::vector<std::unique_ptr<Item>> {std::make_move_iterator(std::begin(itemArr)), std::make_move_iterator(std::end(itemArr))};
}

std::vector<std::unique_ptr<Item>> items_;
};

Online Demo

关于c++ - 用于将 unique_ptr 的 vector 初始化为基类型的可变参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33747131/

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