我希望定义两个使用相同代码的不同名称的库
I am looking to define two library with different names that use the same code
我有一个 C++ 库,它有一个函数叫做 ExampleFunction()
。此功能已记录并已在使用中。不幸的是,库的风格要求调用此函数exampleFunction()
{首字母小写}。
我需要保留旧名称以实现向后兼容性,但将新名称添加为 public 函数。最有效的方法是什么?
我假设添加以下定义:
void exampleFunction() {ExampleFunction();}
不是解决这个问题的最佳方法,我正在寻找选择。
I am assuming that adding a definition of "void exampleFunction() {ExampleFunction(); return;}" is not the best way of solving this
我建议不要假设这样的事情。这是解决这个问题的好方法。
am looking for options.
另一种选择是使用函数引用(或者函数指针):
auto& exampleFunction = ExampleFunction;
您可以将实际实现的现有函数重命名为 exampleFunction()
,因为它应该是这样。然后,旧名称的用户 1) 仍然有工作代码,并且 2) 被告知有一个更新的函数名称可以使用,你可以这样做:
[[deprecated("Use exampleFunction() instead")]]
inline void ExampleFunction() { exampleFunction(); }
这使用了 C++14 及更高版本的 deprecated
attribute。包装函数的性能损失要么不存在(如果真的被编译器内联)要么可以忽略不计。
作为其他答案的替代方案,您可以使用可变参数模板、完美转发和 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)
编译错误对于已弃用的函数来说不是什么好事,但鉴于您一开始就不应该使用它们,这并不是真正的妥协。
请注意,这需要您将原始函数从 ExampleFunction
重命名为 exampleFunction
。
我有一个 C++ 库,它有一个函数叫做 ExampleFunction()
。此功能已记录并已在使用中。不幸的是,库的风格要求调用此函数exampleFunction()
{首字母小写}。
我需要保留旧名称以实现向后兼容性,但将新名称添加为 public 函数。最有效的方法是什么?
我假设添加以下定义:
void exampleFunction() {ExampleFunction();}
不是解决这个问题的最佳方法,我正在寻找选择。
I am assuming that adding a definition of "void exampleFunction() {ExampleFunction(); return;}" is not the best way of solving this
我建议不要假设这样的事情。这是解决这个问题的好方法。
am looking for options.
另一种选择是使用函数引用(或者函数指针):
auto& exampleFunction = ExampleFunction;
您可以将实际实现的现有函数重命名为 exampleFunction()
,因为它应该是这样。然后,旧名称的用户 1) 仍然有工作代码,并且 2) 被告知有一个更新的函数名称可以使用,你可以这样做:
[[deprecated("Use exampleFunction() instead")]]
inline void ExampleFunction() { exampleFunction(); }
这使用了 C++14 及更高版本的 deprecated
attribute。包装函数的性能损失要么不存在(如果真的被编译器内联)要么可以忽略不计。
作为其他答案的替代方案,您可以使用可变参数模板、完美转发和 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)
编译错误对于已弃用的函数来说不是什么好事,但鉴于您一开始就不应该使用它们,这并不是真正的妥协。
请注意,这需要您将原始函数从 ExampleFunction
重命名为 exampleFunction
。