C++ 当p是函数指针时,我们应该使用p(..)还是(*p)(..)?

C++ 当p是函数指针时,我们应该使用p(..)还是(*p)(..)?,c++,C++,参考: 取消对函数指针的引用将产生另一个函数指针。所以,只要f(),否则您只会混淆代码 指向成员的指针是完全不同的。它们需要使用*或->*运算符。这也是为什么您应该使用std::function(或boost::function)而不是函数/memebers的原始指针。您可以使用任何一种形式,但(在我看来)使用这种形式是最自然的: p(x, y); 两者都可以: p(); (*p)(); 但第一个更可取,因为它更符合函子对象。例如,您可以将函数模板编写为: template<typ

参考:


取消对函数指针的引用将产生另一个函数指针。所以,只要
f()
,否则您只会混淆代码


指向成员的指针是完全不同的。它们需要使用
*
->*
运算符。这也是为什么您应该使用
std::function
(或
boost::function
)而不是函数/memebers的原始指针。

您可以使用任何一种形式,但(在我看来)使用这种形式是最自然的:

p(x, y);
两者都可以:

  p();
(*p)();
但第一个更可取,因为它更符合函子对象。例如,您可以将函数模板编写为:

template<typename Functor>
void f(Functor fun)
{
     fun(); //uniform invocation - it doesn't matter what it is.
}
模板
void f(函子fun)
{
fun();//统一调用-它是什么并不重要。
}
现在可以用函数指针和functor对象调用它,这是因为我使用了第一种语法


这个故事的寓意是:争取统一调用。编写代码时,无论调用实体是函数指针还是函数对象,调用语法都应相同。

标准允许您使用的所有形式,除非您愿意 让读者困惑的是,通常最好是明确的:
&f
采取
函数的地址,以及调用函数的
(*p)(x,y)

指向成员函数的指针是一个完全不同的主题。我在结尾简要地提到了它们。显然,你应该使用
(************************p)(
)!也许人们应该认为<代码> STD::函数有相当大的开销,所以在紧要关头,直截了当的PTMF可能是更好的。@ KerrekSB,你知道最近的基准吗?我偶然读到一篇关于codeproject的文章,该文章提供了一个fast委托和bechmarks的黑客实现,但它的数据是相当旧的IIRC。@TamásSzelei:恐怕不是,但我知道,
std::function
本质上是设计迫使它在内部使用类型擦除,这需要虚拟调度和动态分配,我有一种预感,出于根本原因,这是无法优化的。因此,如果您处于一个紧密的循环中,或者需要内存位置,那么可能需要付出真正的代价。不过,我也很想看到比较!codeproject上有几篇“FastDelegate”文章声称速度更快(有些文章符合标准)。我认为,如果编译器将该类识别为“内部”并适当地处理它,则可以对其进行优化。是否有一篇文章解释了类型擦除和动态分派的必要性?我想了解一下,我不同意第二段。成员函数指针和
std::function
解决了两个不同的问题,说“使用一个而不是另一个”忽略了这一差异。我已经测试了
*p()
,VS2010报告了“错误C2100:非法间接寻址”@q0987:是。我错了。这是不允许的。我更正了我的答案。很久以前我在某个地方听到过这个。
  p();
(*p)();
template<typename Functor>
void f(Functor fun)
{
     fun(); //uniform invocation - it doesn't matter what it is.
}