2012-03-31 28 views
8

ストレージクラスへのアクセスを少し簡単にしようとしたところ、多くの知識がないという状況に陥りました。そして、私と同じことをしようとしている人々を見つけることは容易ではありません。C++配列の添え字演算子テンプレート

私がやろうとしているのは、値の配列を内部的に文字列として格納するクラスですが、ユーザーの終わりから単純な型キャストが可能です。私が計画していたのは、配列の添え字演算子を使ってテンプレートを通して指定した型を返すことです。実際に動作するよりもはるかに良いとは言えますが、ここでは、私がやっていることの簡単な例を挙げて、はどのようにしてが働くべきかを知ることができます。

class StringList 
{ 
    public: 
    template <typename T> 
    T operator[](const int i) 
} 

そこから、いくつかの特定のテンプレートを定義し、必要に応じてすべてのユーザーが非常に簡単に定義できます。しかし、これの最大の問題は、テンプレートを使って添字演算子を呼び出す方法がわかりません。最初は、テンプレートメソッドを呼び出す標準的な方法と似ていると考えて、私は以下のことを仮定しました(明らかに正しくありません)。

StringList list; 
T var = list<T>[0]; 

サブスクリプト演算子をテンプレートとして呼び出す適切な方法を知っている人はいますか?または、これを避け、名前付きメソッドを使用する必要がありますか?

+0

オーバーロードされた演算子は構文的に意味があるときに最もよく使用されるので、この目的のために 'operator []'のオーバーロードには注意が必要です。あなたは通常 'リスト [0]'のようなものを書きません。余分な知的オーバーヘッドは価値がないと思います。テンプレート 'get'メソッドを作成し、' list.get (0) 'を呼び出すのはなぜでしょうか? – templatetypedef

+0

@templatetypedef私は完全に同意します。私はgetのような名前付き関数に固執しようとしていましたが、このようなテンプレートをどのように書くのか分からないと考えていました。しかし、私はそれを使用する必要があるかどうかに関わらず、どのように書かれているかを知りたいと思っています。 – TheCodeBroski

答えて

10

オペレータを呼び出す唯一の方法は、明示的にlist.operator[]<T>()と書いています。

うち二つの基本的な方法があります(templatetypedefによって提案されたように)

  1. list.get<int>()のような関数テンプレートを書く
  2. 戻るTへの自動会話でプロキシが。

コードは次のようになります。私は、オペレータの自然なコール[]にテンプレートパラメータを渡すための構文はありませんだと思う

// in the class 
struct proxy { 
    proxy(StringList *list, int i) : list(list), i(i) {} 
    StringList *list; 
    int i; 
    template <typename T> 
    operator T() { return list->get<T>(i); } 
}; 

proxy operator[](int i) { return proxy(this, i); } 

template <typename T> 
T get(int i) { return ...; T(); } 

// how to use it: 
StringList list; 
int var = list.get<int>(0); 
float var2 = list[0]; 
+1

私はあなたのプロキシベースのソリューションをよく理解していないことを認めなければなりません。ちょっと凝っていただけますか? 'T get(int i){return ...;}の目的は何ですか? T(); } '?どのように 'プロキシ演算子[](int i){returnプロキシ(これ、私); } '' StringList'に関連していますか? 'float var2 = list [0];'はどのように動作しますか?先進的なC++テクニックの私の知識はここには理由があるかもしれません。 :-) –

4

T var = list.operator[]<T>(0); 

通常のテンプレート関数と同じように、ここで演算子のオーバーロードを使用する必要はありません。

関連する問題