我有一个Foo类,其成员变量类型为std::vector<std::unique_ptr<Bar>>
,我想填写该类的构造函数的初始化列表。这可能吗?
我希望可以使用vector的fill构造函数,像这样
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;
}
动态对象数的解决方案:
#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;
}
}
并查看此内容以获取更多详细信息。我可以列表初始化仅移动类型的向量吗?
编辑:
对于没有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)... ) );
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句