據我瞭解copy-and-swap成語,它有一個需要bolierplate代碼的缺點。考慮一個簡單的「剛好保持所有這些該死的 - 檸檬」的結構:自定義交換樣板
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.
風格的初始化,這段代碼需要更大的空間。並且MyType
和MyOtherType
也可能用這種技術來定義......有什麼辦法可以減少這裏的重複性?例如,當添加新字段時,忘記添加相應的swap(...)
行會非常容易,這會導致一個神祕的切片。
不壞。由於MSVC 2010(我使用)提供了對'std :: tuple'或多或少體面的支持,這就是我會花一段時間的答案。 –