プロが教える店舗&オフィスのセキュリティ対策術

ソースを見ていて分からないところがあったので教えて下さい。
なんと説明すればいいのか分からないので下に要約したソースを書きます。

template <typename T>
class Hoge {
T a_;
public:
Hoge(T a = 0) : a_(a) {}

operator T() const { // ココが分からない
return a_;
}
};

最初は、関数オブジェクトかと思ったのですがそうではないですよね?
operator()(引数) ですよね?

次は、Tのコンストラクタかと思ったのですが、class Hoge の中に書くのも変な気がしました。

A 回答 (2件)

それは、(templateに限らない)暗黙の型変換演算子定義です。


例えば、T=intの場合、
Hoge hoge;
int foo = hoge; // ここでhoge::operator int()constが呼ばれる
というようなことができます。

普通のクラスでも
class Bar
{
int bar_;
public:
 operator int()const { return bar_; }
// ....
}
等が定義可能です。言語の参考書などを確認してみてください。

この回答への補足

主にCをやってきた人間なのですが
キャストが関数になるという、感覚がなかったです。
dynamic_cast,static_cast,reinterpret_cast,const_cast,boost::lexical_cast
あたりもそうですね。

以下のようにすれば、複数キャストが作れますね。
あたりまえですが。
template <typename T, typename U>
class Hoge {
T a_;
U b_;
public:
explicit Hoge(T a, U b) : a_(a), b_(b) {}

operator T() const {
return a_;
}
operator U() const {
return b_;
}
};

int main() {
Hoge<int, char*> a(4, "abc");
int x = a;
char * y = a;
...
}

補足日時:2007/05/03 06:15
    • good
    • 0
この回答へのお礼

ありがとうございます。
うまく表現できないですが
explicit で制限することの逆というか
そういう感じですね。

お礼日時:2007/05/03 06:15

Hoge を T に暗黙的にキャストするためのキャスト演算子の定義。

    • good
    • 0
この回答へのお礼

ありがとうございます。
やっと、意味が理解できました
T が型名なので、キャストなんですね。

お礼日時:2007/05/03 06:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!