2

<T, R>T がオブジェクトで、R が または のいずれかでvector<T*>あるコンテナー テンプレート クラスを作成する必要がありますlist<T*>。insert(T) size() などの一般的な操作をサポートする必要があります...

T dataリストまたはベクトルと呼ばれるクラスメンバーを保持しています。問題は、コードをどのように記述すれば、実行時にどの操作を呼び出すかを知ることがstd::listできるかということstd::vectorです。

たとえば、コンテナー内の最初の要素を取得するにdata[0]は、ベクターの場合とdata.front()リストの場合で呼び出す必要があります。typeid演算子を使用する必要がありますか?

if (typeid(R) ==  typeid(vector<T*>))
  then ...
else if (typeid(R) == typeid(list<T*>))
 then ...

それとももっと良い方法がありますか?

4

4 に答える 4

4

テンプレートの特殊化を使用する必要があります。あなたはそれについての良い記事を読むことができますここ.

于 2012-05-22T12:12:05.917 に答える
2

イテレータを使用できます。これは STL の標準イディオムです。begin()コレクションの先頭を指す反復子を取得し、最後を取得するために使用しますend()(より正確には、コレクション内の最後の要素の「後」の要素を指す反復子)。コレクションの末尾に要素を追加したり、特定の位置に要素を追加したり、コレクションから要素を削除したりするために、 と のpush_back()両方list<>で使用することもできます。より一般的な関数については、リファレンス ( vectorlist ) を確認してください。vector<>insert()erase

テンプレートのメソッド呼び出しは、インスタンス化の時点まで (特にテンプレート関数の呼び出しまで) チェックされないため、上記の呼び出しは、テンプレートで指定した正確なコレクション型にバインドされます。

于 2012-05-22T12:13:19.560 に答える
0

答えは mfontanini が与えたものであり、特殊化を使用します。ただし、特定の例では、ベクトルはフロントもサポートし、ベクトルとリストは可能な限り同じ機能を持っています

于 2012-05-22T12:14:30.887 に答える
0

セットが非常に限られている場合は、次のようなことができます。

#include <vector>
#include <list>
using namespace std;

template < typename T, typename V >
class X;

class XImpl {};

template < typename T >
class X< T, vector<T*> > : XImpl {};


template < typename T >
class X< T, list<T*> > : XImpl {};

int main()
{
    X< int,vector<int*> > a;
    X< double, list<double*> > b;
    X<int, int> c; // error
}

そして、実装を に入れますXImpl

編集: XImpl も同様にテンプレート化される可能性が高いです。このコードは、ベクターまたはリスト以外のコンテナーに対するガードを示しているだけです。そしてもちろん、 のような悪い組み合わせに対するガードX<int, vector<double*> >です。

于 2012-05-22T12:14:22.150 に答える