2 つのクラス インスタンスを交換するために使用swap
します。エラーが発生する場合があります。
#include <iostream>
#include <string>
using namespace std;
#include <cstring>
class Buffer {
public:
Buffer(const string& s): buffer(s) {}
string buffer;
};
template<class _Tx>
void SWAP(_Tx& a, _Tx& b) {
size_t size = sizeof(_Tx);
char buffer[size];
memcpy(buffer, &a, size);
memcpy(&a, &b, size);
memcpy(&b, buffer, size);
}
int main() {
Buffer a("This is a"), b("This is b");
swap(a,b);
cout << a.buffer << endl;
SWAP(a,b);
cout << b.buffer << endl;
return 0;
}
std::swap
これは次のようになります。
template<class _Tx>
void swap(_Tx &a, _Tx &b) {
_Tx t = a;
a = b;
b = t;
}
_Tx t = a;
この場合_Tx
は、のコピー コンストラクターが呼び出されます。Buffer::Buffer(Buffer &e)
このメソッドはメモリを割り当てようとするため、エラーが発生する可能性があります。
代わりに別の方法を使用しようとしていますstd::swap
:
template<class _Tx>
void SWAP(_Tx& a, _Tx& b) {
char buffer[sizeof(_Tx)];
memcpy(buffer, &a, sizeof(_Tx));
memcpy(&a, &b, sizeof(_Tx));
memcpy(&b, buffer, sizeof(_Tx));
}
それは安全な方法ですか?
UPDATES
std::swap
は c++0x で安全かもしれません。これは比較です: c99対c++0x
REF What-is-the-copy-and-swap-idiom Donal Fellows のリマインダーに感謝