C++;继承语句中的部分专门化? 所以我用C++模板来处理自己的问题。假设我得到了表单中类似容器的类的层次结构: template <class T> class AContainer{ // ... }; 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, std::size_t N> class AStaticSizeContainer: public AContainer<T>{ // ... };

C++;继承语句中的部分专门化? 所以我用C++模板来处理自己的问题。假设我得到了表单中类似容器的类的层次结构: template <class T> class AContainer{ // ... }; 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, std::size_t N> class AStaticSizeContainer: public AContainer<T>{ // ... };,c++,templates,inheritance,template-specialization,partial-specialization,C++,Templates,Inheritance,Template Specialization,Partial Specialization,这样,StaticSizer::SizedStaticContainer就是一个与模板签名模板类C匹配的类。然而,这也有一些缺点。第一个也是显而易见的问题是,需要始终使用StaticSize::SizedStaticContainer而不是AStaticSizeContainer,即使T和N是“已知的”。这是由于这两种情况不可互换(一种是从另一种继承的)。第二个缺点是,asaticsizecontainer的所有构造函数都必须为StaticSizer::SizedStaticContainer进

这样,
StaticSizer::SizedStaticContainer
就是一个与模板签名
模板类C
匹配的类。然而,这也有一些缺点。第一个也是显而易见的问题是,需要始终使用
StaticSize::SizedStaticContainer
而不是
AStaticSizeContainer
,即使
T
N
是“已知的”。这是由于这两种情况不可互换(一种是从另一种继承的)。第二个缺点是,
asaticsizecontainer
的所有构造函数都必须为
StaticSizer::SizedStaticContainer
进行复制粘贴。我相信还有更多的东西我还没有发现

因此,我的问题如下:

是否有一种更优雅的方法来解决这个问题,同时符合已经布置好的接口? 更广泛地说,我们能以更优雅的方式指定类的部分专门化吗? 更狭义地说,我们是否有这样的语法:

template <class T, std::size_t N>
class AnOperatorForStaticSize: public AnOperator<AStaticSizeContainer<with N = N>, T>{
    // ...
};
模板

显然,公共操作员显然是可以工作的,但我需要一个C++ 03替代方案。

< P>在C++的早期,人们用各种类似的方法进行试验,但没有一种方法能解决。根据过去近20年的经验,可能会设计出一种更好的方法,但似乎通用编程(以STL的形式引入)提供了一种有效的解决方案,它没有您描述的任何问题。解决方案的基本思想是:引入一个额外的间接层次。不要将结构绑定到操作符,而是根据对结构的通用访问方法来实现操作符。在STL中,结构是序列,运算符是算法,中间的胶是迭代器。

< P>在C++的早期人们用各种类似的方法进行试验,没有一个结果出来。根据过去近20年的经验,可能会设计出一种更好的方法,但似乎通用编程(以STL的形式引入)提供了一种有效的解决方案,它没有您描述的任何问题。解决方案的基本思想是:引入一个额外的间接层次。不要将结构绑定到操作符,而是根据对结构的通用访问方法来实现操作符。在STL中,结构是序列,操作符是算法,中间的粘合剂是迭代器

template <class T, std::size_t N>
class AStaticSizeContainer: public AContainer<T>{
    // ...
};
template <class T, std::size_t N>
class StaticSizer{
public:
    template <class T1>
    class SizedStaticContainer: public AStaticSizeContainer<N, T1>{
        // ...
    };
};
template <class T, std::size_t N>
class AnOperatorForStaticSize: public AnOperator<AStaticSizeContainer<with N = N>, T>{
    // ...
};