如何在不破坏现有应用程序的情况下更改API中stl容器的数据类型? 我有一个基于库的C++,其中许多API都有STL容器作为参数。和stl容器是int类型。像 f1(std::vector<int> items) f2(std::map<int, int> mp) f1(标准::向量项) f2(标准::映射mp)

如何在不破坏现有应用程序的情况下更改API中stl容器的数据类型? 我有一个基于库的C++,其中许多API都有STL容器作为参数。和stl容器是int类型。像 f1(std::vector<int> items) f2(std::map<int, int> mp) f1(标准::向量项) f2(标准::映射mp),c++,stl,C++,Stl,现在需要将int类型更改为long-long int(64位整数)。像 f1(标准::向量项) f2(标准::映射mp) 基于该库已经开发了许多应用程序。如果我将API签名从int改为long-long-int,将破坏这些应用程序。由于有很多API,我不想让每个API都过载 有没有一种方法可以在不破坏现有应用程序和不使用函数重载的情况下支持这些API中的long int 是否可以创建一个基于函数调用隐式转换为std::vector或std::vector的包装类?问题是,如果不希望现有应用程序

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

f1(标准::向量项)
f2(标准::映射mp)
基于该库已经开发了许多应用程序。如果我将API签名从int改为long-long-int,将破坏这些应用程序。由于有很多API,我不想让每个API都过载

有没有一种方法可以在不破坏现有应用程序和不使用函数重载的情况下支持这些API中的long int


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

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

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


我还建议传递vector by(const)引用,这样可以避免不必要地复制可能的大数据,并且不会中断客户端,因为调用语法保持不变。

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

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


我还建议通过(const)引用传递vector,这样可以避免不必要地复制可能的大数据,并且不会破坏客户端,因为调用语法保持不变。

我认为重载每个函数比创建包装类的工作量要少。您还可以为每个函数设置模板。现有调用将调用
f1
,新调用将调用
f1
。调用方(或新包装类)如何知道要转换为哪一个?现在还不清楚你想要完成什么。无论如何,最干净的处理方法也不是重载。只需提供一个全新的API(可能在并行名称空间下),并保持对旧API的支持(旧API可能只是将调用转发给新的、更通用的API)。使用与现有函数不含糊的函数模板。这样既不会影响现有功能,也会支持更多的数据类型。我认为重载每个函数比创建包装器类要省力。您还可以为每个函数设置模板。现有调用将调用
f1
,新调用将调用
f1
。调用方(或新包装类)如何知道要转换为哪一个?现在还不清楚你想要完成什么。无论如何,最干净的处理方法也不是重载。只需提供一个全新的API(可能在并行名称空间下),并保持对旧API的支持(旧API可能只是将调用转发给新的、更通用的API)。使用与现有函数不含糊的函数模板。我希望现有应用程序能够使用像std::vector这样的容器,但较新的应用程序可以使用像std::vector这样的容器更新我的回答我希望现有应用程序能够使用像std::vector这样的容器,但较新的应用程序可以使用像container一样的容器矢量更新了我的答案
f1(std::vector<long long int> items)
f2(std::map<long long int, int> mp)