2012-01-23 8 views
0

<T>への単一のポインタを含むUResクラスがあり、間接演算子->*がオーバーロードされているため、インスタンスをポインタとして直接使用できます。テンプレートオブジェクトをC++のテンプレートポインタに自動キャスト

しかし、UResインスタンスを通常はUResインスタンス内のポインタを取る関数に渡すこともできます。

私のUResインスタンスオブジェクトが関数に渡されると、そのオブジェクトに含まれるポインタに自動的にキャストされるようにするにはどうすればよいですか?

+3

あなたの投稿をフォーマットする方法を学んでください。三ヶ月はどのように学ぶための時間です! –

答えて

4

と同じ方法で、アウトバウンド変換:演算子を宣言して定義します。

この場合、メンバーはoperator T*になります。

Example

template <typename T> 
struct Foo { 
    operator T*() { 
     return 0; 
    } 
}; 

void bar(int* p) {} 

int main() { 
    Foo<int> f; 
    bar(f); 
} 

しかし、私はこれを回避し、代わりにメンバーT* get()を実装するお勧めします。オブジェクトからポインタを取得する呼び出しスコープの場合は、の明示的なステップである必要があります。

+0

私はすでに*演算子がオーバーロードされていますが、それは私が行くのが良いということですか?私はいくつかのキャストを実装しなければならないと思った。 – dtech

+2

@ddriver:これは 'T&operator *()'ではなく、 '演算子T *()'です - その違いに注意してください。 –

+0

@ddriver:あなたは「コンバージョン」を意味します。キャストは明示的な変換であり、これはこれとは関係ありません。 –

2

あなたはポインタ型にそのクラスから変換演算子を提供することであることを行うことができます。

class Foo { 
public: 
    operator int() const { // enables implicit conversion from Foo to int 
    } 
}; 

注意を、このような暗黙の型変換can introduce unexpected behaviorこと。

+0

'int'はポインタ型ではありません –

+1

これはまだユーザ定義の変換の有効な例ですか? –

+0

しかし、質問で要求されたユーザー定義の変換ではありません:P –