【问题标题】:How to change data type of stl containers in API without breaking existing application?如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
【发布时间】:2018-10-06 03:03:57
【问题描述】:

我有一个基于库的 c++,其中许多 API 都将 stl 容器作为参数。 stl 容器是 int 类型。喜欢

f1(std::vector<int> items)
f2(std::map<int, int> mp)

现在需要将 int 类型更改为 long long int(64 位整数)。喜欢

f1(std::vector<long long int> items)
f2(std::map<long long int, int> mp)

已经基于该库开发了许多应用程序。如果我将 API 签名从 int 更改为 long long int,则会破坏这些应用程序。由于 API 很多,我不想重载每个 API。

有没有办法在这些 API 中支持 long long int 而不会破坏现有应用程序并且不使用函数重载?

是否有可能创建一个包装类,它会根据函数调用将自身隐式转换为 std::vector 或 std::vector?

【问题讨论】:

  • 我认为重载每个函数比创建包装类要少。您还可以对每个函数进行模板化。现有呼叫将呼叫f1&lt;vector&lt;int&gt;&gt;,新呼叫将呼叫f1&lt;vector&lt;long long&gt;&gt;
  • 调用者(或新的包装类)应该如何知道要转换到哪一个?目前尚不清楚您要完成什么。无论如何,最干净的处理方式也不是超载。只需提供一个全新的 API(可能在并行命名空间下),并保持对旧 API 的支持(旧 API 可能只是将调用转发给更通用的新 API)。
  • 使用与您现有的函数没有歧义的函数模板。这样现有的功能就不会受到影响,并且会支持更多的数据类型。

标签: c++ stl


【解决方案1】:

问题是,如果您不想破坏现有应用程序,就不能要求他们更改代码。如果您在 API 内部需要 64 位整数,您可以只转换元素(或复制输入向量),但由于传递的参数很可能是 32 位整数,long long 可以存储的附加信息反正不在那里。如果要有效传递 64 位数据,则​​必须更改客户端代码。

编辑:如果较新的实现应该能够使用long long,那么我建议重载是您的最佳选择。转换为vector&lt;int&gt; 将丢失信息,更改唯一方法的签名将破坏当前客户端。当有人调用旧变体时,您可以将单个元素转换为 long long。如果要存储整个向量,只需复制即可。

我还建议通过 (const) 引用传递向量,您可以避免不必要的大数据副本,并且不会破坏客户端,因为调用语法保持不变。

【讨论】:

  • 我希望现有应用程序能够使用像 std::vector 这样的容器,但更新的应用程序可以使用像 std::vector 这样的容器
  • 更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2021-03-14
  • 2010-12-21
  • 2020-01-09
  • 2011-03-11
相关资源
最近更新 更多