为函数定义 typedef,该函数返回指向类似自身的函数的函数指针
Defining a typedef for a function that returns a function pointer to a function like itself
我对这个有点困惑。 最简单的思考方法是一组实现状态机状态并返回下一个状态的函数(请注意 - FSM 示例只是激励性的,我不是在寻找如何设计 FSM)。
所以我正在寻找一个 C 样式的 typedef 和一个 C++ 11,使用 StateHandler(一个函数指针)的定义,其中代码类似于(忽略声明等):
// typdef for StateHandler
// -- and to see the new c++ 11 way --
// using StateHandler = StateHandler (*)(State *, int); // note -- does not compile
StateHandler StateOne(State *state, int arbitraryArgs) {
// do stuff and go to state 2
return StateTwo;
}
StateHandler StateTwo(State *state, int arbitraryArgs) {
// do stuff and go to state 1
return StateOne;
}
你不能这样做,因为它需要无限类型。您需要在此处使用函数对象。
struct StateOne;
struct StateTwo;
struct StateOne {
StateTwo operator()(State* state, int arbitraryArgs) const;
};
struct StateTwo {
StateOne operator()(State* state, int arbitraryArgs) const;
};
StateTwo StateOne::operator()(State* state, int arbitraryArgs) const {
// do stuff
return StateTwo();
}
StateOne StateTwo::operator()(State* state, int arbitraryArgs) const {
// do stuff
return StateOne();
}
如果需要可以存储这些函数对象之一的变量,则需要类型擦除。您可以使用包含纯虚拟operator()
函数的抽象基类和std::unique_ptr
.
其中 FuncType
是函数类型的名称,您不能让它返回FuncType
。 但是你可以让它在函数类型(StateHandler
)周围返回一个轻量级包装器。 然后我们可以定义函数调用运算符operator()
,使其行为类似于函数。
struct StateHandler;
typedef StateHandler (*FuncType)(State *, int); //using FuncType = StateHandler (*)(State *, int);
struct StateHandler {
FuncType m_f;
StateHandler(FuncType f_) : m_f(f_) {}
StateHandler operator() (State *s, int arbitraryArgs) {
return m_f(s,arbitraryArgs);
}
};
// declare both functions in advance, so their definitions can return each other
StateHandler StateOne(State *state, int arbitraryArgs);
StateHandler StateTwo(State *state, int arbitraryArgs);
StateHandler StateOne(State *state, int arbitraryArgs) {
// do stuff and go to state 2
return StateTwo;
}
StateHandler StateTwo(State *state, int arbitraryArgs) {
// do stuff and go to state 1
return StateTwo;
}
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针