这是一个仿函数:
class add_x {
int x;
public:
add_x(int x) : x(x) {}
int operator()(int y) { return x + y; }
};
从主要我可以这样做:
add_x add10(10); // create my functor
int i = add10(20); // add 20 and return it
如何将仿函数与typedef
组合?
例如,我遇到了这个:
typedef int (*myfuncType)(float f, char c1,char c2);
myfuncType pt2Function = NULL;
但我在这里完全定义了什么?运营商()
?
答案 0 :(得分:5)
函数指针 - 正如其名称所示 - 只是一个指向函数的指针。你不能使用指向函数的指针指向仿函数,仿函数本质上是一个带有重载()运算符的类。
您可能对C ++ 11中的std :: function感兴趣:
#include <functional>
(...)
std::function<int(int)> fn = add_x(10);
int i = fn(20);
<小时/> 编辑:好的,我明白了,你要的是什么。
也许某些代码会使事情变得清晰。
int fn(float a, char b, char c) { ... }
(...)
typedef int (*myFuncType)(float f, char c1, char c2);
myFuncType ptrToFun = &fn;
(*fn)(1.0f, 'a', 'z');
此typedef创建“指向函数的指针”类型。如果你声明一个这种类型的变量,那么你将能够为它分配一个指向函数的指针(用常规&amp;运算符提取),并且 - 例如 - 传递给另一个函数或者只是存储(或调用这个函数)。
std :: function更加灵活,因为你可以在其中存储一个指向函数,仿函数甚至是lambda的指针并正常调用它们。
答案 1 :(得分:3)
我不明白你的第一个问题(How can I combine the functor with typedef ?
),所以我无法回答这个问题 - typedef
可以像任何其他类一样工作。
关于你的第二个问题:第
行typedef int (*myfuncType)(float f, char c1,char c2);
为类型myfunctType
提供一个名称(int (*)(float, char, char)
)(读取:“一个函数,它接受float
和两个char
值,然后返回{{1 }}“)。
所以
int
定义一个可以指向上述函数的变量,但现在将指针设置为NULL。
答案 2 :(得分:1)
这里,myfuncType
是一个描述函数指针的类型,有三个float参数并返回一个int。仿函数只是一个带有operator()重载的类。所以typedef就像其他类一样使用。
typedef add_x add
将有效。