1

我有一个 c++ 库,它有一个名为ExampleFunction(). 此功能已记录并已在使用中。不幸的是,库的风格要求这个函数被称为exampleFunction(){首字母是小写}。

我需要保留旧名称以实现向后兼容性,但将新名称添加为公共函数。最有效的方法是什么?

我假设添加以下定义:

void exampleFunction() {ExampleFunction();}

不是解决这个问题的最佳方法,我正在寻找选择。

4

3 回答 3

3

我假设添加“void exampleFunction() {ExampleFunction(); return;}”的定义不是解决这个问题的最佳方法

我建议不要假设这样的事情。这是解决这个问题的好方法。

我正在寻找选择。

另一种选择是使用函数引用(或函数指针):

auto& exampleFunction = ExampleFunction;
于 2020-06-29T14:23:27.493 回答
2

您可以将实际具有实现的现有函数重命名为exampleFunction(),因为它应该是这样的。然后,旧名称的用户 1) 仍然有工作代码,并且 2) 被告知有一个更新的函数名称可以使用,您可以这样做:

[[deprecated("Use exampleFunction() instead")]]
inline void ExampleFunction() { exampleFunction(); }

这使用了C++14 及更高版本的deprecated属性。包装函数的性能影响要么不存在(如果真的被编译器内联)要么可以忽略不计。

于 2020-06-29T14:29:38.023 回答
1

作为其他答案的替代方案,您可以使用可变参数模板、完美转发和decltype(auto).

template<typename ...Args>
[[deprecated("use exampleFunction")]] decltype(auto) ExampleFunction(Args &&...args)
{
    return exampleFunction(std::forward<Args>(args)...);
}

您可以定义一个宏来声明这些函数:

#define def_deprecated_func(old_name, new_name)                          \
template<typename ...Args>                                               \
[[deprecated("use " #new_name)]] decltype(auto) old_name(Args &&...args) \
{                                                                        \
    return new_name(std::forward<Args>(args)...);                        \
}

// ...

def_deprecated_func(ExampleFunction, exampleFunction)

编译错误对于不推荐使用的函数来说不是很好,但是看到你不应该首先使用它们,这并不是真正的妥协。

请注意,这需要您将原始函数从 重命名ExampleFunctionexampleFunction

于 2020-06-29T14:49:10.063 回答