所以我用C ++模板做了一个泡菜。假设我有一个类似容器的类的层次结构:
template <class T>
class AContainer{
// ...
};
通过继承,可以创建具有不同内部表示的不同容器:
template <class T>
class AVectorLikeContainer: public AContainer<T>{
// ...
};
还有一堆类似于运算符的类的层次结构,其形式为:
template <template <class T> class C, class T>
class AnOperator{
public:
virtual T operator() (const C<T> &c1, const C<T> &c2);
// ...
};
使用这样的继承和部分特化算法:
template <class T>
class AnOperatorForVectorLike: public AnOperator<AvectorLikeContainer, T>{
public:
virtual T operator() (const AVectorLikeContainer<T> &c1, const AVectorLikeContainer<T> &c2);
// ...
};
现在,稍后在项目中,形式为
的容器template <class T, std::size_t N>
class AStaticSizeContainer: public AContainer<T>{
// ...
};
被介绍了。显然,这种设计会中断,因为AStaticSizeContainer
与template <class T> class C
的模板签名的AnOperator
部分不匹配。解决这个问题的方法是引入一个类似的元函数:
template <class T, std::size_t N>
class StaticSizer{
public:
template <class T1>
class SizedStaticContainer: public AStaticSizeContainer<N, T1>{
// ...
};
};
这样,StaticSizer<25>::SizedStaticContainer
是一个与模板签名template <class T> class C
匹配的类。但是,这有一些缺点。第一个也就是显而易见的是,即使StaticSize<N>::SizedStaticContainer<T>
和AStaticSizeContainer<T, N>
是&#34;已知&#34;,也需要始终使用T
代替N
。这是因为两者不可互换(一个是从另一个继承)。第二个缺点是AStaticSizeContainer
的所有构造函数必须按字面复制粘贴StaticSizer::SizedStaticContainer
。我确信还有更多我尚未偶然发现。
所以,我的问题如下:
是否有更优雅的方法来解决这个问题,同时符合已经布局的界面? 从更广泛的角度来说,我们能否以更优雅的方式指定一个类的部分特化? 在较窄的术语中,我们是否有语法来表达:
template <class T, std::size_t N>
class AnOperatorForStaticSize: public AnOperator<AStaticSizeContainer<with N = N>, T>{
// ...
};
在AStaticSizeContainer<with N = N>
之后,我指的是AStaticSizeContainer
与上述模板N
的部分特化。
修改 C ++ 11&#39; s alias templates显然会起作用,但我需要一个C ++ 03替代方案。
答案 0 :(得分:1)
在C ++的早期阶段,人们尝试了各种类似的方法,但没有一个能够解决问题。根据过去近20年的经验,可以设计出更好的方法,但似乎通用编程(以STL的形式引入)提供了一种工作解决方案,它没有您描述的任何问题。解决方案的基本思想是fundamental approach to solve problems in computer science:引入额外的间接层。您可以根据对结构的通用访问方法来实现运算符,而不是将结构绑定到运算符。在STL中,结构是序列,运算符是算法,其间的粘合剂是迭代器。