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

标签 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 long int?

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

最佳答案

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

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

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

关于c++ - 如何在不破坏现有应用程序的情况下更改 API 中 STL 容器的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675352/

相关文章:

C++ 错误 : LNK2001 and LNK1120

C++11 内存排序——区别?

c++ - 将 ppm 文件通过管道传输到 ffmpeg 以在 C++ 中创建电影

c++ - 为什么我不能插入指向多重集的 const 指针?

c++ - STL迭代器包装器

c++ - std::queue 内存消耗导致内存泄漏 - C++?

c++ - 如果 bug 没有持续明显地出现,如何查看它是否仍然存在?

c++ - STL std::remove_copy

c++ - 创建和管理 STL 列表的子列表

c++ - Opencv:cvCaptureFromCAM 返回 NULL