【问题标题】:Proper way of returning a functor in C++在 C++ 中返回函子的正确方法
【发布时间】:2021-04-12 20:54:23
【问题描述】:

假设我们有一个像这样声明的add 函数:

int add(const int a, const int b);

如果我们要从 foo 返回这个 add 函数...

std::function<int(const int, const int)> foo()
{
    return add;
}
std::function<int(const int, const int)> foo()
{
    return &add;
}

以上哪一项是返回函数对象的正确方法,因为两者的工作方式完全相同?

【问题讨论】:

  • 还要考虑auto foo() -&gt; int(&amp;)(int, int) { return add; },其中&amp;add 不起作用,所以有一个“正确”的方法

标签: c++ pointers function-pointers functor function-object


【解决方案1】:

两个代码 sn-ps 是相同的(就语言而言)。

std::function 可以从任何可调用对象(无论是 lambda、函数指针等)构造。在这两个示例中,您都在使用函数指针构造 std::function

  • 在第一个例子中,add 表示一个函数的名称——它衰减为一个函数指针。

  • 在第二个示例中,表达式&amp;add 显式获取函数地址,生成函数指针。

没有“正确”的约定,因为每个约定都同样有效。代码库中最重要的是一致性和可读性。所以我会坚持现有代码库使用的任何做法,或者你组织的编码约定中规定的任何做法。

【讨论】:

  • 我知道它们是一样的,但是在做这种事情时普遍接受的约定是什么?
  • 没有明确接受的约定(事实上,这样的问题对于 Stack-Overflow 来说是题外话,因为它是基于意见的)。不同的组织可能对惯例有不同的偏好,任何这样的惯例都可能同样有效。
  • 我不同意这个问题是题外话。这个特定问题可能没有客观答案,但对于许多其他情况,其中两个(或许多)功能相同的语法之一被认为是“最佳实践”。不问,我不知道它的答案是否“无关紧要”。
  • 我可以将其添加到答案中,尽管问题的措辞并没有明确说明它询问惯例(这就是我尚未添加此内容的原因)。至于它是否离题:几乎任何可能基于约定的东西通常都是离题的,尤其是在没有任何标准编码约定的 C++ 中。最重要的是一致性。
  • 请注意,从函数到函数指针的转换继承自 C,对于成员指针,没有隐式转换,如果可以指导约定,则需要 &amp; (&amp;MyClass::foo)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2023-03-10
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多