C 11:如何给函数起别名?

新手上路,请多包涵

如果我在命名空间栏中有一个类 Foo:

 namespace bar
{
    class Foo { ... }
};

然后我可以:

 using Baz = bar::Foo;

现在就像我在命名空间中使用名称 Baz 定义的类一样。

是否可以对功能做同样的事情?

 namespace bar
{
    void f();
}

接着:

 using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type

最干净的方法是什么?

该解决方案还应该适用于模板函数。

定义: 如果某个实体 B 是 A 的 别名,那么如果 A 的任何或所有用法(当然不是声明或定义)在源代码中被 B 替换,那么(剥离的)生成的代码保持不变。例如 typedef A B 是一个别名。 #define B A 是别名(至少)。 T& B = A 不是别名,B 可以有效地实现为间接指针,而“未别名”的 A 可以使用“立即语义”。

原文由 Andrew Tomazos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 886
2 个回答

您可以使用完美转发来定义函数别名(有一些工作):

 template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
  return f(std::forward<Args>(args)...);
}

即使 f 被重载和/或函数模板,此解决方案也适用。

原文由 Jeremiah Willcock 发布,翻译遵循 CC BY-SA 3.0 许可协议

constexpr 函数指针可以用作函数别名。

 namespace bar
{
    int f();
}

constexpr auto g = bar::f;

使用 g 很可能(但语言不能保证)直接使用 bar::f 。具体来说,这取决于编译器版本和优化级别。

尤其是在以下情况下:

  • GCC 4.7.1+,没有优化,
  • Clang 3.1+,没有优化,
  • MSVC 19.14+,经过优化。

请参阅 这些编译器生成的程序集

原文由 Paweł Bylica 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题