如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?

How to change data type of stl containers in API without breaking existing application?

本文关键字:API stl 数据类型 情况下 应用程序      更新时间:2023-10-16

我有一个基于库的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 更改为长整型,则会破坏这些应用程序。由于有很多 API,我不想重载每个 API。

有没有办法在这些 API 中支持长整型,而不会破坏现有应用程序,也不使用函数重载?

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

问题是,如果你不希望现有的应用程序中断,你就不能要求它们更改代码。如果 API 内部需要 64 位整数,只需强制转换元素(或复制输入向量(,但由于传递的参数很可能是 32 位整数,因此long long可以存储的其他信息无论如何都不存在。如果要有效地传递 64 位数据,则必须更改客户端代码。

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

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