[英]Copy constructors with move-only, but cloneable types in member containers
假设我们有两种类型, T1
和T2
。
除了以下事实外, T1
并不重要:
T1 copy(T1 const& orig)
,它创建了一个副本。 T2
可以简化为以下类:
// T2.h
class T2 {
public:
T2() { /* initializes the vector with something */ }
T2(T2 const& other);
private:
std::vector<T1> v;
}
// T2.cpp
T2::T2(T2 const& other) : ... {}
如果您只能写入省略号部分或全局范围,您将如何实现此方法?
一个简单的现实世界用例 - 假设“你不能在大括号之间写任何东西”部分是现实世界的限制:
T1
是std::unique_ptr<anything>
copy
是std::make_unique
anything
都有一个复制构造函数我对实现还有两个额外的要求:
for
循环的幼稚实现慢。和可选的,但很高兴有功能:
澄清:我知道这个问题可以用std::vector<T1> copy_vec(std::vector<T1> const& orig)
全局函数std::vector<T1> copy_vec(std::vector<T1> const& orig)
。 将该函数放入T2.cpp
的匿名命名空间也会使其成为本地,但我会反对它的可读性,我认为它根本不会比 for 循环更好。 如果复制构造函数不在实现文件中而是内联在标题中,这显然是一个糟糕的解决方案。
所以我的问题的改写是:
unique_ptr
,这是一个足够常见的情况。天真的循环没有错:
v.reserve(other.v.size());
for (auto& elem : other.v) {
v.push_back(copy(elem));
}
这是足够的可读性和最佳。
虽然我猜现代的、聪明的解决方案是使用range-v3 :
T2(T2 const& other)
: v(other.v | view::transform(copy))
{ }
我不确定这是否比循环更好以证明额外的复杂性,但 YMMV。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.