戻り値の型が異なる関数をオーバーロードする

「戻り値の型が異なる関数をオーバーロードしたい!」
ってことがよくある。
とりあえずパッと思いついたのはこれ。
※Traits(=特性)というテクニックらしい 追記:2010-03-14

template<class T> T getValue();
template<> int   getValue<int>()   { return 1; }
template<> char* getValue<char*>() { return "test"; }

int   iHige = getValue<int>();
char* cHige = getValue<char*>();

なんかテンプレート引数の の部分が面倒だ。
そんな時は「変換演算子」を使用するとこうなる。

int   iHige = getValue();
char* cHige = getValue();

[説明]
変換演算子の記述の仕方はこんな感じ。

struct getValue {
    operator int()   { return 1; }
    operator char*() { return "test"; }
};

関数じゃなく演算子でした。
変換演算子は型が必要としている時に呼び出されるようになっています。
記述的に 関数呼び出し演算子 void operator() に似てますが、
変換演算子は operator 型() という形です。


参考リンク
http://www.geocities.jp/ky_webid/cpp/language/029.html