gpt4 book ai didi

c++ - 扩展现有 API : Use default argument or wrapper function?

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:01 24 4
gpt4 key购买 nike

我有一个现有的方法(或一般函数),我需要它来增加额外的功能,但我不想在代码的其他地方中断对该方法的任何使用。示例:

int foo::bar(int x)
{
// a whole lot of code here
return 2 * x + 4;
}

在代码库中被广泛使用。现在我需要将 4 变成一个参数,但是任何已经调用 foo::bar 的代码仍然应该收到它所期望的。我是否应该扩展并重命名旧方法并将其包装成一个新方法,例如

int foo::extended_bar(int x, int y)
{
// ...
return 2 * x + y;
}

int foo::bar(int x)
{
return extended_bar(x,4);
}

或者我应该像这样在头文件中声明一个默认参数

int bar(int x, int y=4);

只是扩展功能

int foo::bar(int x, int y)
{
// ...
return 2 * x + y;
}

每种变体的优点和缺点是什么?

最佳答案

我通常使用包装函数(大部分时间通过重载)而不是默认参数。

原因是有两个级别的向后兼容性:

  1. 具有源代码级 向后兼容性意味着您必须重新编译调用代码而无需更改,因为新函数签名与旧函数签名兼容。两者都可以达到这个水平;默认值和包装器/重载。

  2. 更强的级别是二进制级向后兼容性,它甚至可以在不重新编译的情况下工作,例如当您无权访问调用代码时。想象一下你以二进制形式部署你的函数,比如在 DLL 等中。在这种情况下,签名必须完全相同才能使其工作,默认值不是这种情况 - 它们会破坏这种兼容性级别.

包装函数的另一个优点是 - 如果您的应用程序有任何类型的日志记录 - 您可以在旧函数中转储一个警告,它会在未来版本中过时,建议使用新函数。

关于c++ - 扩展现有 API : Use default argument or wrapper function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/940877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com