5

私はこの不自然な例のような状況を持っています:

template<class TFeature> struct Controller {};

template<class TController,typename T> struct Feature {
  typedef Feature<TController,T> FeatureType;
};

typedef Controller<Feature::FeatureType,int> DefaultController;

コントローラーは機能を受け入れるようにテンプレート化されていますが、私の問題は、一部の機能がテンプレートパラメーターとしてコントローラーのタイプを必要とすることです。これにより、サンプルの最後の行の typedef がコンパイルされません。

これは可能ですか、それとも設計を再考する必要がありますか?

4

4 に答える 4

2

これを達成するには、メタ プログラミング マジックを実行する必要があります (簡単な作業ではないと思います)。しかし、本当にそれが必要で、使用boostがオプションである場合は、次のboost::mplようなものを使用できます。

template< class ControlerT >
struct FeatureEx {
    typedef ControlerT controler_type;
};
template< class FeatureT >
struct ControlerEx {
    typedef ControlerEx<FeatureT> this_type;
    typedef typename boost::mpl::apply<
        FeatureT, boost::mpl::identity<this_type>
    >::type feature_type;

    feature_type const& get_feature() const {return f_;}

private:
    feature_type f_;
};

typedef ControlerEx<FeatureEx<boost::mpl::placeholders::_1> > DefaultControler;
于 2012-10-21T12:53:38.480 に答える
1

クラスに 2 つのテンプレート パラメーターを渡してControllerいますが、1 つだけを取るように宣言しています。以下のようなものが必要ですか?

typedef Controller<Feature<Controller<int>,int>::FeatureType> DefaultController;
于 2012-10-21T12:25:20.297 に答える
0

Controller テンプレートに 2 つのパラメーターを渡そうとしているようですが、1 つしか受け入れることができません。

于 2012-10-21T12:27:24.290 に答える
0

1 つのオプションは、typedef の代わりにダミーのサブクラスを使用することです。

struct DefaultController : public Controller<Feature<DefaultController,int>::FeatureType> {};
于 2012-10-21T12:20:57.390 に答える