继承语句中的C ++部分特化?

时间:2013-09-15 12:27:38

标签: c++ templates inheritance template-specialization partial-specialization

所以我用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>{
    // ...
};

被介绍了。显然,这种设计会中断,因为AStaticSizeContainertemplate <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替代方案。

1 个答案:

答案 0 :(得分:1)

在C ++的早期阶段,人们尝试了各种类似的方法,但没有一个能够解决问题。根据过去近20年的经验,可以设计出更好的方法,但似乎通用编程(以STL的形式引入)提供了一种工作解决方案,它没有您描述的任何问题。解决方案的基本思想是fundamental approach to solve problems in computer science:引入额外的间接层。您可以根据对结构的通用访问方法来实现运算符,而不是将结构绑定到运算符。在STL中,结构是序列,运算符是算法,其间的粘合剂是迭代器。