函数指针作为类方法声明中的参数

Posted

技术标签:

【中文标题】函数指针作为类方法声明中的参数【英文标题】:Function pointer as parameter in a class method declaration 【发布时间】:2014-09-12 04:38:55 【问题描述】:

我正在尝试创建一个将函数指针(常规 C 函数指针,而不是类方法指针)作为参数的类方法。我搜索时唯一出现的是如何创建/使用成员函数指针,我不想这样做。所以这里有一个方法,它接受一个函数指针,该指针返回一个布尔值并接受两个整数作为参数:

class ExampleA

public:
  void sort(WHAT_GOES_HERE); // Should it be the same as method definition below?
;

ExampleA::sort(bool (*customSort)(int, int)) // Hopefully this is correct

  // Use function pointer

有没有办法在方法声明中声明参数而不用像带int参数的方法一样命名?

class ExampleB

public:
  void someFunction(int); // Not named here
;

ExampleB::someFunction(int varName)

  // do whatever

【问题讨论】:

###另见How do function pointers in C work? 【参考方案1】:

是的!把名字去掉就行了。

void sort(bool (*)(int, int));

【讨论】:

【参考方案2】:
bool (*)(int, int)

基本上,去掉变量名就可以得到一个没有变量名的声明。

但是,通常最好使用 typedef:

typedef bool(*custom_sorter)(int, int);

class ExampleA 
public:
  void sort(custom_sorter);
;

ExampleA::sort(custom_sorter customSort) 
  // Use function pointer

这是等价的。

由于我个人讨厌声明函数指针的语法,在 C++11 中我可能会这样做:

template<class T> using type=T;

...

  void sort(type<bool(int,int)>*)

将签名类型放在一起,然后我在它后面加上一个* 使其成为一个指针。

但我很奇怪。

【讨论】:

我想这可能是我第一次看到模板化的using 声明。甚至不知道这是合法的...... ...那是因为它是一个新的 C++11 特性。不错。【参考方案3】:

声明应与定义匹配,因此WHAT_GOES_HERE 应为bool (*customSort)(int, int),并且函数定义应指定返回类型void

您可以选择省略名称customSort,没有区别。

这有点不灵活;考虑将其设为接受函子或std::function 而不是函数指针的函数模板;那么您的调用者可以使用更广泛的函数调用它。

【讨论】:

以上是关于函数指针作为类方法声明中的参数的主要内容,如果未能解决你的问题,请参考以下文章

指向类方法的函数指针作为参数

函数指针与类成员函数指针

成员函数指针作为构造函数参数

用函数指针包装 C++ 代码作为 cython 中的模板参数

C++中的函数指针和函数对象总结

指针的本质分析