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

时间:2011-11-22 17:46:25

标签: c++

参考:[33.11] Can I convert a pointer-to-function to a void*?

#include "stdafx.h"
#include <iostream>

int f(char x, int y) { return x; }
int g(char x, int y) { return y; }

typedef int(*FunctPtr)(char,int);

int callit(FunctPtr p, char x, int y)  // original
{
    return p(x, y);
}

int callitB(FunctPtr p, char x, int y) // updated
{
    return (*p)(x, y);
}

int _tmain(int argc, _TCHAR* argv[])
{
    FunctPtr p = g;                    // original
    std::cout << p('c', 'a') << std::endl;

    FunctPtr pB = &g;                  // updated
    std::cout << (*pB)('c', 'a') << std::endl;

    return 0;
}

问题&gt; 哪种方式,原始或更新,是推荐的方法? 我用VS2010测试了这两种方法,每种方法都打印出正确的结果。

谢谢

虽然我在原帖中看到以下用法:

 void baz()
 {
   FredMemFn p = &Fred::f;  ← declare a member-function pointer
   ...
 }

4 个答案:

答案 0 :(得分:6)

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

指向成员的指针完全是不同的野兽。他们需要使用.*->*运营商。这也是你应该使用std::function(或boost::function)代替函数/成员的原始指针的原因。

答案 1 :(得分:6)

两者都没关系:

  p();
(*p)();

但第一个更可取,因为它与仿函数对象更加一致。例如,您可以将函数模板编写为:

template<typename Functor>
void f(Functor fun)
{
     fun(); //uniform invocation - it doesn't matter what it is.
}

现在可以使用函数指针和functor对象来调用它,这两者都是因为我使用了第一种语法而成为可能。

故事的寓意是:争取统一调用。以调用语法应该相同的方式编写代码,而不管调用实体是函数指针还是函数对象。

答案 2 :(得分:1)

该标准允许您使用的所有表单,但除非您愿意 让读者感到困惑,通常最好是明确的:&f来接受 函数的地址,以及(*p)( x, y )来调用它。

答案 3 :(得分:0)

你可以使用任何一种形式,但看起来最自然(对我来说)使用它:

p(x, y);