在我的一个项目中,我有以下类模板层次结构:
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
中的一个。
基本上,filter
可以拥有自己的父 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,但如果有更好的解决方案,请随时发布,因为它总是很有用)
谢谢。
答案 0 :(得分: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;
};
然后可以根据需要使用它,如果您想要更多参数,则必须手动扩展它。
答案 1 :(得分: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