1

私のプロジェクトの1つに、次のクラステンプレート階層があります。

template <typename FruitType, typename ParentFilterType = void>
class filter;

template <typename FruitType> // Specialization when no parent filter is needed
class filter<FruitType, void>;

どこFruitTypeにでもあります。apple、、bananaまたはのいずれかであるとしましょうorange。したがって、基本的に、afilterは独自の filterタイプを持つことができます。

私はコードを制御できません。コードはそのままにしてfilterおく必要があります。

通常、ユーザーコードは次のようになります。

filter<apple, filter<banana, filter<orange> > > my_apple_filter;

明らかに、これは少し冗長です。もっと読みやすくすることは可能かと思いました。何かのようなもの:

complex_filter<apple, banana, orange>::type my_apple_filter;

どこcomplex_filter<apple, banana, orange>::typeに解決しますかfilter<apple, filter<banana, filter<orange> > >

内部をテンプレートにしcomplex_filterてみましたが、今のところ成功していません。テンプレートパラメータの数は可変である必要があります(たとえば、1から5まで)。structtypedef

似たようなものが必要になったことがありますか?どうすればそれができますか?

(残念ながら、C ++ 0xを使用することはできませんが、より良い解決策がある場合は、いつでも知っておくとよいので、遠慮なく投稿してください)

ありがとうございました。

4

2 に答える 2

4

C ++ 0xでは、可変個引数テンプレートになります。

C ++ 0xがない場合は、デフォルトが提供されている状態で、パラメーターの大規模なリストを使用できます。

template <typename F0, typename F1 = void, typename F2 = void, typename F3 = void>
struct complex_filter
{
  typedef filter<F0, typename complex_filter<F1, F2, F3>::type> type;
};

template <>
struct complex_filter<void,void,void,void>
{
  typedef void type;
};

その後、これを必要に応じて使用できます。さらに多くのパラメーターが必要な場合は、手動で拡張する必要があります。

于 2011-08-16T13:30:55.980 に答える
0

あなたが試したことはうまくいくはずです、ある種:

template< class A, class B >
struct complex_filter2
{
  typedef typename filter< A, filter< B > > type;
};

template< class A, class B, class C >
struct complex_filter3
{
  typedef typename filter< A, filter< B, filter< C > > > type;
};

//etc
于 2011-08-16T13:06:56.330 に答える