2009-07-12 9 views
31

C++では、クラスにテンプレート演算子を使用できますか?これと同じように:演算子を含む関数テンプレート

class MyClass { 
public: 
    template<class T> 
    T operator()() { /* return some T */ }; 
} 

これは実際にはうまくコンパイルするようだが、混乱は1つがそれを使用する方法で提供されます:

MyClass c; 
int i = c<int>(); // This doesn't work 
int i = (int)c(); // Neither does this* 

それがすべてでコンパイルするという事実は、それはなんとかだと私に提案し、私はそれを使う方法を失うだけです!任意の提案、またはこの使用方法は非スターターですか?

+1

「これは動作しない/どちらも実行しない」という意味はどうですか?何が起こるのですか? –

+0

コンパイラbarfsがあなたに起こったのはどういうことでしょうか? – Toji

+0

私はこの質問を以前に見たことがあると私は誓っています...私はそれを見つけることはできませんので、明らかにあなたを責めることはできません。 – GManNickG

答えて

41

Tを指定する必要があります。

int i = c.operator()<int>(); 

残念ながら、この場合は関数呼び出しの構文を直接使用することはできません。

編集:ああ、あなたはクラス定義の冒頭にpublic:がありません。

+1

ニース。迅速で正確な答えの名誉!残念なことに、おそらく私の用法を冗長にしているかもしれません(私のコードは他人から呼び出されることを意図していますので混乱を避けたいので)別のルートを探すだけです。再度、感謝します! – Toji

+5

はい、おそらく、 'operator()'の代わりに 'get'メソッドを定義する方が良いでしょう。それで 'c.get ()'と書くことができます。 – avakar

+0

実際には、多くの人が使っているイディオムがあります:free get関数(タプルは 'get (some_tuple)'を使用し、boost.variantは 'get (some_variant)'を使用します)。だからあなたは 'get (c)'のようになり、 'get'は' MyClass'の名前空間で定義されます)。 –

18

あなたは基本的に正しいです。テンプレート演算子を定義するのは合法ですが、明示的なテンプレート引数で直接呼び出すことはできません。

あなたはこの演算子がある場合:あなたの例のように

template <typename T> 
T operator()(); 

を、それだけで次のように呼び出すことができます。もちろん

int i = c.operator()<int>(); 

、テンプレート引数は、引数から推定することができれば、

template <typename T> 
T operator()(T value); 

c(42); // would call operator()<int> 

代わりに、次のようにarを作成することもできます参照をgument、そしてそこに出力を保存し、代わりにそれを返すので:

template <typename T> 
void operator()(T& value); 

をので、これに代えて:あなたは

int r; 
c(r); 

を行うことができ

int r = c.operator()<int>(); 

それとも単に定義する必要があります演算子を使用する代わりに単純なget<T>()関数を使用します。

4

あなたは

class Foo { 
    public: 
    template<typename T> 
    operator T() const { return T(42); } 
}; 

Foo foo; 

int i = (int) foo; // less evil: static_cast<int>(foo); 

live exampleのことを考えていません。これにより、受け入れられた回答の主張にもかかわらず、テンプレートの引数を指定する必要がないことが証明されます。

+0

この場合は動作しますが、私は 'c ++'を考えていました。私はこれがうまくいかないことを意味しています。私はちょっとそこの表記法を悪用しています... – kim366

+0

@ kim366:それは意味がないので、それについて考えるのは無意味です。それはうまく動くべきではなく、うまくいかない。 – MSalters

+0

はい、私はそれを知っています..しかし、クールだ:P – kim366

関連する問題