2011-10-30 15 views
0

使い方に基づいてクラスの型を宣言できるようにします。たとえば、3つのキューが接続された3ステージのパイプラインを作成します。キューとステージを正しく接続しているかどうかを確認したい(例:キューが正しい方向に、正しいユニットに移動しているなど)テンプレートを使用してC++で型を指定するには?

ここは私のものの非常に単純化された例です達成しようとしています:

template<class in, class out> 
class Fifo: public queue{}; 

class Stage1; class Stage2; class Stage3; 

class Stage1{ 
    Fifo<Stage1,Stage2>* m_fifoOut; 
}; 

class Stage2{ 
    Fifo<Stage1,Stage2>* m_fifoIn; 
    Fifo<Stage2,Stage3>* m_fifoOut; 
}; 

class Stage3{ 
    Fifo<Stage2,Stage3>* m_fifoIn; 
}; 

これを機能的に達成するより適切な方法はありますか?コンパイル時に、キューが正しく設定されていないことを知ることが望ましいです。しかし、私は、テンプレートを使用すると不要なクラスのコピーが生成されることを心配しています。

+0

「不要なコピー」は本当に心配です。代わりに、テンプレートを使用してこれを全面的に実行するためのメンテナンスコストを心配しています。これは、ランタイム情報に基づいてパイプラインを構築する必要がある場合、部分的な書き直しを余儀なくされることを意味します。実行する前に設定をチェックする別のツールを書くことができます(たとえば、ファイルを使用してパイプライン設定を読み込み、テンプレートを使用せずに注文を実行するなど)。 – phooji

答えて

0

これまで通り完全に合理的に見えます。私が働いている会社では、定期的にテンプレートを使っています(あなたが知りたくない)、そして重複したオブジェクトコードに関連する問題は一度もありませんでした。考えている)。

+0

ええ、私は大学で新しく、私はテンプレートを使うのが比較的新しいです。だから私は自分の新しい習慣を正しい習慣にしたいと思っています;)。タイプチェックが必要なだけの追加オーバーヘッドを受け入れるのは難しいことです。 – Nickker22

+0

各クラスにはまだポインタ(または2つ)が格納されているため、コードが実行される限り、実行時のメモリや速度のオーバーヘッドはありません。コンパイラは、各クラスの型情報を扱うためには少し難しく作業しなければなりません。 – Dabbler

1

私は私が正しくキューと一緒にステージを接続することを確認する(例:キューがなど、右ユニットに、正しい方向に向かっている。)

だけ持っています第2の型を生成するメタ関数。最初の型を指定するだけです。

template<class In> 
struct get_target; 

class Stage1; class Stage2; class Stage3; 

template<> 
struct get_target<Stage1>{ 
    typedef Stage2 type; 
}; 

template<> 
struct get_target<Stage2>{ 
    typedef Stage3 type; 
}; 

template<class In> 
class Fifo : public queue{ 
    typedef In in_type; 
    typedef typename get_target<In>::type out_type; 
}; 

struct Stage1{ 
    Fifo<Stage1> m_fifoOut; 
}; 

struct Stage2{ 
    Fifo<Stage1> m_fifoIn; 
    Fifo<Stage2> m_fifoOut; 
}; 

struct Stage1{ 
    Fifo<Stage2> m_fifoIn; 
}; 
2

私はパイプラインをもう少し直接的に表現しようと考えています。具体的には、私はFIFOの代わりにパイプラインステージに集中しようとします。 C++ 11が利用可能な場合は、パイプラインステージのタイプを指定するバリアブルテンプレートがあり、各パイプラインステージと次のパイプステージの間に自動的にFIFOが生成されます。

+0

私はこれが単純な例でうまくいくと期待していますが、いくつかの段階で複数の入出力を持つことができるので、達成しようとしているものではないかもしれません。 – Nickker22

+0

@ Nickker22:その場合、ビルドしているのはパイプラインではなくグラフです。間違いなくもう少し複雑になるだろうが、それはまだ動作させることができると確信している。 –

関連する問題