【问题标题】:C++ partial specialization within the inheritance statement?继承语句中的 C++ 部分特化?
【发布时间】:2013-09-15 12:27:37
【问题描述】:

所以我让自己陷入了使用 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 与AnOperator 的模板签名的template &lt;class T&gt; class C 部分不匹配。解决这个问题的一种方法是引入一个像这样的元函数:

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

这样,StaticSizer&lt;25&gt;::SizedStaticContainer 是一个匹配模板签名template &lt;class T&gt; class C 的类。但是,这有一些缺点。第一个也是显而易见的一个是需要始终使用StaticSize&lt;N&gt;::SizedStaticContainer&lt;T&gt; 而不是AStaticSizeContainer&lt;T, N&gt;,即使T 和N 是“已知的”。这是因为两者不可互换(一个继承自另一个)。第二个缺点是AStaticSizeContainer 的所有构造函数都必须为StaticSizer::SizedStaticContainer 复制粘贴。我敢肯定还有更多我还没有发现。

所以,我的问题如下:

有没有更优雅的方法来解决这个问题,同时符合已经布局的界面? 更广泛地说,我们能否以更优雅的方式指定一个类的部分特化? 在狭义上,我们是否有这样的语法:

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

在AStaticSizeContainer&lt;with N = N&gt; 中,我使用上述模板中的N 指代AStaticSizeContainer 的部分特化。

编辑 C++11 的alias templates 显然可以工作,但我需要一个 C++03 替代方案。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2013-06-12
      • 2021-12-09
      相关资源
      最近更新 更多