#include <cstdio>
#include <list>
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
namespace {
struct Hoge { int& instance_; Hoge(int& i) : instance_(i) {} Hoge(const Hoge& h) : instance_(h.instance_) {}
// Sutterさんのoperator= Hoge& operator = (Hoge h) { swap(h); return *this; }
// リファレンスタイプのインスタンスは通常の方法ではswapできないので、 // コピーコンストラクタとnewの第二構文を使った初期化を使って実現する。 void swap(Hoge& h) { Hoge tmp(h); // hをコピー h.~Hoge(); // hを破棄 new(&h) Hoge(*this); // hのアドレスにthisのコピーを生成 this->~Hoge(); // thisを破棄 new(this) Hoge(tmp); // thisのアドレスにhのコピーであるtmpを生成 }
bool operator < (const Hoge& h) const { return instance_ < h.instance_; }
};
inline void swap(Hoge& h1, Hoge& h2) { h1.swap(h2); }
// output用 void print(const Hoge& h) { printf("%d\n", h.instance_); }
}
int main(int argc, char* argv[]) {
int i1 = 1; int i2 = 2; int i3 = 3; Hoge h1(i1), h2(i2), h3(i3); std::vector<Hoge> vectorhoge; vectorhoge.push_back(h3); // operator =がないとvector::push_backはでき ない vectorhoge.push_back(h2); vectorhoge.push_back(h1); std::back_inserter(vectorhoge) = h1; std::sort(vectorhoge.begin(), vectorhoge.end()); // operator =がないと vector::push_backはできない std::cout << "vector sort" << std::endl; std::for_each(vectorhoge.begin(), vectorhoge.end(), print);
std::list<Hoge> listhoge; listhoge.push_back(h3); listhoge.push_back(h2); listhoge.push_back(h1); std::back_inserter(listhoge) = h1; listhoge.sort(); std::cout << "list sort" << std::endl; std::for_each(listhoge.begin(), listhoge.end(), print);
return 0;
}