2016-05-26 12 views
0

私はC++の初心者です。基本的には、STLコンテナをテンプレートとして使用して、その中に渡されている型が格納されているかどうかを判断しようとしています。私はクラステンプレートを使用する必要があるか、独自の構造体または何を定義する必要があるかわかりません。C++テンプレートSTLコンテナ

ここで私が達成したいかについて、いくつかの解説と一緒に、私が持っているもの、実質的です:これはことも可能である場合

std::deque<template class T> messages; <--- ??? 

//the goal being not to store ANY type in this deque, but to somehow 
//template it for each type that needs to be stored 
//e.g. a different deque for an int, bool, ADT, etc. 

template<class T> bool StoreMessage(T const &messageToStore){ 
    messages<T>.push_back(messageToStore); 
} 

私もこれにアプローチする方法は考えているかが、私は本当にドンロットがあるので、格納する必要がある各タイプの関数を記述しなければならない。またはvoid *を使用してください。私は安全のためにそれをしたくないので、プロセスはまったく同じになるとはいえ、各タイプの処理方法を明示的に定義する必要があります。

ありがとうございます!参照によるコンテナと要素の両方を渡し、それを呼び出すに

template <typename T> 
bool store_message(const T &message, std::deque<T> &container) { 
    container.push_back(message); 
} 

+4

'std :: deque'は、私があなたに完全に誤解していない限り、あなたが望むようにすでに動作します。 – Galik

+0

標準**テンプレート**ライブラリ(これはもはやそれの正しい名前ではありません)(https://stackoverflow.com/questions/5205491/whats-this-stl-vs-c-standard-library-fight- all-about))は、ほとんどの(すべての)コンテナに対してすでにテンプレートを使用しています。 – CoryKramer

+0

@Galikデュークにはすでにどの型も格納できることがわかりましたが、デキュ自体がテンプレート化されているとは思いませんでした。 目的は、メソッドに渡されるものを格納するためにテンプレート化されたdequeメンバー変数を持つことです。メンバー変数としてdeque を使用すると、Tが自分のクラスの型ではないのでコンパイラエラーが発生します。 – dlar

答えて

0

実際にあなたは次のようなことをすることができます:

#include <deque> 

template <class T> 
struct container { 
    static std::deque<T> messages; 
}; 

template <class T> 
std::deque<T> container<T>::messages; 

template<class T> bool StoreMessage(T const &messageToStore){ 
    container<T>::messages.push_back(messageToStore); 
} 

int main() { 
    int a = 10; 
    StoreMessage(a); 
} 

あなたはあなたの変数をテンプレート化された構造を追加し、それを静的変数に入れます。ただし、コンパイラに静的変数を宣言して、この変数にメモリを割り当てる必要があります。これは、行:template <class T> std::deque<T> container<T>::messages;で行われます。これを正しく行うには、テンプレート化されたものをヘッダファイルに移動することを忘れないでください。この方法で、すべてのcpp/ccファイル間のメッセージにアクセスできます。作成したヘッダファイルをインクルードするだけです。

+0

うわー、これは完全に機能するようです。これの静的な側面を取り除き、オブジェクトの各インスタンスに対して両端キューをユニークにすることはできますか?私は基本クラスで、派生クラスがどのようなメッセージタイプを格納しているかを知っていますが、同じ型のメッセージを同じコンテナに格納しないようにします(例えば、YとZはXと両方のストアint、それで私はYに独自のX :: containerを持たせたいと思っていますとZは独自のX :: containerを持っています)これは不可能ですか?もしそうでなければ、私は別のデザインを使わなければならないでしょう。 – dlar

+0

@dlarコンテナをメッセージのタイプと関連する変数の型に依存させることができると思いますので、 'container :: message'のようにsthを作成すると可能になります。 .. –

+0

とdownvoteは...ですか? –

3

コンテナはそう何をやろうとしていることは、おそらくこのようなもので、既にテンプレート化されている

std::deque<int> numbers; 
int el = 5; 

store_message(el, numbers); 
+0

私はそれを使用すると、各データ型の両端キューを作成する必要がありますか? dequeは、テンプレート化されていないクラスのメンバ変数です。 – dlar

+0

はい、型のコンテナは何とかどこかで定義する必要があります。あなたはおそらくそれを手動で行なわない方法を見つけることができます。 –

+0

私はdeque として私の.hファイルで定義していましたが、Tは私の基本クラスのメンバーではないので動作しません。私は、デキュー自体をテンプレート化できるかどうかを確認しようとしていたのですが、デッキ内のどのような型も格納しないでください。 – dlar

関連する問題