首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过编写包装器将RogueWave替换为标准库

通过编写包装器将RogueWave替换为标准库
EN

Stack Overflow用户
提问于 2018-12-11 13:15:04
回答 2查看 357关注 0票数 0

关于这篇文章

How do I abstract away from using RogueWave in legacy code?

就像这样-

代码语言:javascript
运行
复制
template<class T, class Container = std::deque<T> >
class my_stack
{
public:
    void push(const T& t)
    {
        m_stack.push(t);
    }
    // ... so on ...

protected:
    std::stack<T, Container> m_stack;
};

包装器是RogueWave::stack和std::stack方法的联合吗?或者我们是否公开底层的std::stack对象以供客户端直接调用std::stack方法?请给我一些想法。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-12-11 13:27:51

为什么不用没有包装器的std::stack替换RougeWave::stack呢?

包装器方法需要维护包装器和容器类之间的接口。您需要正确地处理像右值引用这样的事情,但是除非您添加了重要的功能(对于std::stack,这似乎不太可能),否则您可以从中获得的好处是有限的。

我看到您有protected:,所以可能是您在容器上使用了继承。这也可能是一件值得删除的好事情。

std::stack现在是语言的一部分,它将比像RogueWave这样的第三方库拥有更长的生命周期。

票数 1
EN

Stack Overflow用户

发布于 2019-02-16 11:50:45

我们即将结束一个在遗留代码中包装和删除RW的漫长项目。我将以RWOrdered为例,用OOrdered替换它。

如果你有包含RW的代码,那么它很可能是遗留代码。如果你发现移除RW不是小事,那么它可能是很大的。您可能不再了解其设计的所有细节。改变它的工作方式可能会带来很多麻烦。应避免RWOrdered和OOrdered之间的任何接口或行为差异。

如果你用像RW这样的东西替换RW,你就摆脱了许可费,拥有你所有的代码,可以做64位构建,等等。但是你没有得到比RW更好的东西。您可能不希望将其用作所有未来容器的基础。

RW在当时是世界级的代码。你正在用自制软件取代它,即使你包装了世界级的std容器。有时,std类与RW类的工作方式不同。你将不得不解决RW已经解决的问题。您还会发现std库解决了RW没有解决的问题。

  • C++模板容器是强类型的。RW容器可以包含从RWCollectable继承的任何内容。也就是说,您可以混合类型。使OOrdered成为模板类可能不是您想要的。
  • 标准类清楚地区分了等价性和等价性。find()算法使用相等operator==()来查找项。通常按operator<()对set<>进行排序。当set::insert(a)使用基于这个操作符的等价性来确定一个项目是否已经在集合中。它查找a

在RW中,RWCollectable定义了isEqual()、compareTo()和hash()。也就是说,等价性和等价性对所有集合都可用。有时,RW混合了相等和等价,特别是当集合嵌套时。

您需要知道哪个RW函数做了什么,以及哪个std库实体做了什么。您需要选择与RW行为完全匹配的方式,或者选择不同的方式。

  • 这些例子很容易解决,但有些更难。序列化对我们来说是一个痛点。我们希望使用boost序列化来取代SaveGuts()和RestoreGuts()。我们有嵌套容器,有时内部容器是由不同于外部容器的DLL分配的。这打破了boost。解决办法是存在的,但它们并不是微不足道的。

按部就班地进行。

  • Write OCollectable,它包装了RWCollectable。
  • 编写从OCollectable继承的类型,如OWidget。RW定义了实现一些基本功能的宏,比如isA()。使用宏。
  • Write OOrdered,它包装了RWOrdered。
  • 替换代码中的RWOrderd和Widget。如果它们的行为完全相同,您的代码仍然可以工作。
  • 展开宏
  • 将std::vector添加到OOrdered。重写OOrdered成员函数。丢弃那些你不用的。
  • 重写窗口小部件函数。
  • 公开包装向量的一种方法是添加一个getVector()函数。一个用于返回类型的type将会有所帮助。
  • 另一种方法是添加函数,公开您想要的向量函数。
  • 测试,测试,测试

抓取

  • 摆脱一些RW并不太难。摆脱每一个最后的痕迹是很难的。例如,您的OWidget继承自OCollectable,后者又继承自RWCollectable。因此,您可以从OOrdered中提取一个小部件,并将其传递给一个接受RWCollectable的方法。如果更改OCollectable使其不再继承,则不能再传递OWidget类。当所有东西都继承自OCollectable时,您必须等到项目结束时才能删除RWCollectable。
  • 当你写完的时候,你将会是一个行将就木的语言库中的专家。这可能对你的职业生涯比听起来更好。不想自己钻研的人需要这样的专家。另一方面,您也会对一些专有的遗留代码有很多了解。你可能更喜欢蒸汽机方面的职业。
  • 同样,您将熟悉std库。有效的STL已经过时了,但仍然是一本非常好的书。RW没有任何等价物。这很好。它可以防止RW专家充斥市场。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53717761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档