提问者:小点点

我希望定义两个使用相同代码,名称不同的库


我有一个C++库,它有一个名为examplefunction()的函数。 此功能已记录在案,并且已经在使用中。 不幸的是,库的样式要求将此函数称为ExampleFunction(){首字母为小写}。

为了向后兼容,我需要保留旧名称,但将新名称作为公共函数添加。 做这件事最有效率的方法是什么?

我假设增加以下定义:

void exampleFunction() {ExampleFunction();}

并不是解决这个问题的最好办法,我正在寻找其他办法。


共3个答案

匿名用户

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

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

我在寻找选择。

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

auto& exampleFunction = ExampleFunction;

匿名用户

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

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

这将使用C++14及更高版本中的Deprecated属性。 包装器函数的性能要么不存在(如果它不是真正内联的),要么可以忽略不计。

匿名用户

作为其他答案的替代方案,您可以使用variadic模板,perfect forwarding和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