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

标签 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>即使TN是“已知的”。这是由于两者不可互换(一个是从另一个继承而来)造成的。第二个缺点是 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/

相关文章:

c# - 给定一个 C# 类型,获取它的基类和实现的接口(interface)

c++ - 从模板化容器类型中获取元素类型

c++ - C++ 中混合类型的容器(类似于 nsdictionary)

c++ - 在 C++ 中确定数据表事件的类型

c++ - 无法链接它刚刚编译的东西

c++ - 如何解决错误提示 "No matching function call for XXX"?

c++ std::stringstream 给我奇怪的行为

c++ - 是否允许注释与预处理器指令在同一行,在这种情况下它们的含义是什么?

c++ - std::string 和 std::wstring 的前向声明

c++ - ctor和dtor从抽象基类通过其他抽象类继承到具体