gpt4 book ai didi

c++ - 是否可以使用填充构造函数创建 std::vector> ?

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

我有一个 Foo 类,其成员变量类型为 std::vector<std::unique_ptr<Bar>> ,我想填写这个类的构造函数的初始化列表。这可能吗?

我希望可以使用 vector 的填充构造函数,就像这样

Foo::Foo(int n):
vector<unique_ptr<Bar>> (n, unique_ptr<Bar> (new Bar))
{}

但我认为这需要 std::unique_ptr 的复制构造函数,它被删除了(因为它应该被删除)( unique_ptr(const unique_ptr&) = delete )。

有没有更好的方法来解决这个问题?

最佳答案

既然不可复制,那就搬吧!

硬编码对象的解决方案:

#include <memory>
#include <vector>
#include <iterator>
class Bar{};
class Foo{
public:
Foo():bars(get_bars()) {}
std::vector<std::unique_ptr<Bar>> bars;

private:
std::vector<std::unique_ptr<Bar>> get_bars(){
std::unique_ptr<Bar> inilizer_list_temp[]={std::make_unique<Bar>(),std::make_unique<Bar>(),std::make_unique<Bar>()};
return std::vector<std::unique_ptr<Bar>>{std::make_move_iterator(std::begin(inilizer_list_temp)),std::make_move_iterator(std::end(inilizer_list_temp))};
}
};
int main()
{
Foo foo;
}

Live Demo

动态对象数量的解决方案:

#include <memory>
#include <vector>
#include <iterator>
#include <iostream>
class Bar{
public:
int a=5;
};
class Foo{
public:
Foo():bars(get_bars(10)) {}
std::vector<std::unique_ptr<Bar>> bars;

private:
std::vector<std::unique_ptr<Bar>> get_bars(int n){
std::vector<std::unique_ptr<Bar>> inilizer_list_temp;
inilizer_list_temp.reserve(n);
for(size_t i=0;i<n;++i){
inilizer_list_temp.emplace_back(std::make_unique<Bar>());
}
return inilizer_list_temp;
}
};
int main()
{
Foo foo;
for(auto const& item:foo.bars){
std::cout << item->a;
}
}

Live Demo

有关更多详细信息,请参阅此 Can I list-initialize a vector of move-only type?

编辑:

对于没有 std::make_uniuqe 的 C++11 用户:

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

Source

关于c++ - 是否可以使用填充构造函数创建 std::vector<std::unique_ptr<Bar>> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805664/

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