参考:[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
...
}
答案 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);