gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:49:50 24 4
gpt4 key购买 nike

所以我陷入了 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com