2017-12-26 7 views
3

クラスを考慮すると、Fooのは、私が実際に戻り値の型がテンプレート化されたテンプレート、あるオペレータ[]オーバーロードを定義したいですしかし、私はそれを使用する方法を把握することはできません。呼び出すときに型を指定する場所はわかりません。これは、コンパイルしてのいくつかの種類の実際の実装を与えC++演算子のテンプレート戻り値の型は[]

Foo foo; 

int myFooInt = foo.at<int>(32); // gets an int at position 32 

:ようにその後、私は何かを行うことができます

class Foo 
{ 
    template<typename T> T at(size_t i) 
    { 
     return *(reinterpret_cast<T *>(get some pointer)); 
    } 
} 

:参考例を提供するために、で私は[]関数名をオペレータに置き換えると仮定「いくらかのポインタを取得する」ことによって提供される位置指定メモリは、正しい値を返します。 (注、私は "ポジション"が何を意味するかについての情報は提供していません。この場合、私の質問には関係ありません)。

しかし、私はどのように/ []を使用すると入力します。ところで

は、次の作業を行います。

int myFooInt = foo.operator[]<int>(32); 

が、このような何かはコンパイルされません:

int myFooInt = foo[32]<int>; 

もこれを行います:

int myFooInt = foo<int>[32]; 

は、どのようなIです私も可能なことをしようとしていますか?

ありがとうございます。

+2

'foo.operator [] 'は、このようなテンプレートを使用する唯一の方法です。他の選択肢はありません。 –

+0

[std :: any](http://en.cppreference.com/w/cpp/utility/any)または[boost :: any](http://www.boost.org/)の配列を考えましたか? doc/libs/1_66_0/doc/html/any.html)?あなたの 'Foo'クラスはすでに' std :: any'を行っているようです。 – PaulMcKenzie

+0

提案していただきありがとうございますが、この場合、インデックスは実際にはcharインデックスであり、そのベースでオフセットを計算した後は、戻り値の型への型キャストのみです。 (つまり、iバイトを汎用バッファに格納したint(またはfloatなど)を取得します)。 –

答えて

4

演算子の構文に明示的なテンプレート引数を指定することはできません。そのようなことが必要な場合は、foo.at(ndx)は通常の答えです。

関連する問題