【发布时间】:2026-02-01 22:30:01
【问题描述】:
据我了解复制和交换习语,它具有需要样板代码的缺点。考虑一个简单的“just-hold-all-those-damn-lemons”结构:
struct MuchData {
private:
std::string one, two;
int three;
std::vector<Something> four;
MyType five;
MyOtherType six, seven;
unsigned long long int still_overflows;
public:
MuchData() : one("."), two("/"), three(0), four(), five(), six(-1), seven(0), still_overflows(0)
{ }
MuchData(const MuchData& rhs) : one(rhs.one), two(rhs.two), three(rhs.three), four(rhs.four), five(rhs.five), six(rhs.six), seven(rhs.seven), still_overflows(rhs.still_overflows)
{ }
MuchData(MushData&& old) : one("."), two("/"), three(0), four(), five(), six(-1), seven(0), still_overflows(0)
{ swap(*this, old); }
MuchData& operator=(MuchData old) { swap(*old, this); return *this; }
friend void swap(MuchData& left, MushData&right) {
using std::swap;
swap(left.one, right.one);
swap(left.two, right.two);
swap(left.three, right.three);
swap(left.four, right.four);
swap(left.five, right.five);
swap(left.six, right.six);
swap(left.seven, right.seven);
swap(left.still_overflows, right.still_overflows);
}
// And now we can go and do something interesting
};
使用用
编写的初始化程序: one(".")
, two("/")
, three(0)
// etc.
style,这段代码占用了更多空间。而MyType 和MyOtherType 也可能是用这种技术定义的……有什么办法可以减少这里的重复性吗?例如,当添加新字段时,很容易忘记添加相应的swap(...) 行,从而导致神秘的切片。
【问题讨论】:
标签: c++ boilerplate