假设我们有两种类型,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)
全局函数轻松解决。将该函数放入T2.cpp
内的匿名命名空间也会使其成为本地命名空间,但我会反对它的可读性,我认为它根本不会比for循环更好。如果复制构造函数不在实现文件中但在标题中内联,那么这显然是一个糟糕的解决方案。
所以重新解释我的问题是:
unique_ptr
,这是一个很常见的案例。答案 0 :(得分:1)
天真循环没有错:
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。