1

在我的一个项目中,我有以下类模板层次结构:

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

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

哪里FruitType可以是任何东西。假设它是applebanana之一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做一个struct有内部的模板,typedef但到目前为止还没有成功。模板参数的数量应该是可变的(例如,从 1 到 5)。

你有没有需要类似的东西?我怎么能那样做?

(不幸的是,我不能使用 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 回答