所以我陷入了 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>
即使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 的 alias templates显然可以,但我需要一个 C++03 替代方案。
最佳答案
在 C++ 的早期,人们尝试了多种类似的方法,但都没有成功。根据过去近 20 年的经验,有可能设计出更好的方法,但似乎通用编程(以 STL 的形式引入)提供了一个没有您描述的任何问题的可行解决方案。解决方案的基本思路是 fundamental approach to solve problems in computer science : 引入额外的间接级别。您可以根据对结构的通用访问方法来实现运算符,而不是将结构绑定(bind)到运算符。在 STL 中,结构是序列,运算符是算法,中间的粘合剂是迭代器。
关于继承语句中的 C++ 部分特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18812347/