【发布时间】: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<vector<int>>,新呼叫将呼叫f1<vector<long long>>。 -
调用者(或新的包装类)应该如何知道要转换到哪一个?目前尚不清楚您要完成什么。无论如何,最干净的处理方式也不是超载。只需提供一个全新的 API(可能在并行命名空间下),并保持对旧 API 的支持(旧 API 可能只是将调用转发给更通用的新 API)。
-
使用与您现有的函数没有歧义的函数模板。这样现有的功能就不会受到影响,并且会支持更多的数据类型。