下面是一个示例程序,其中'Container'类需要通过基类指针存储'Items'列表。从C ++ 11/14开始,自然的选择是在我拥有的情况下使用std :: unique_ptr和variadic模板。
然而,作为新的我无法理解如何以编译的方式将可变参数列表转换为unique_ptr的向量的初始化列表。非常感谢帮助,因为我在网上找不到任何帮助我解决这个问题的东西(尽管可能在那里!)。
提前致谢:
// 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;
}
答案 0 :(得分:3)
问题是您无法从unique_ptr
移出intializer_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_;
};