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

时间:2018-10-06 03:03:57

标签: c++ stl

我有一个基于库的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 int?

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

1 个答案:

答案 0 :(得分:2)

问题是,如果您不希望破坏现有应用程序,则不能要求它们更改其代码。如果内部需要在API中使用64位整数,则可以强制转换元素(或复制输入向量),但是由于传递的参数很可能是32位整数,因此x = constant_calculated_at_compile_time可以存储不在那里。如果您想有效地传递64位数据,则​​必须更改客户端代码。

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

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