函数能否返回自身类型指针?类内有限状态机函数声明困惑
极简有限状态机的函数声明方案 & 函数返回自身指针的疑问解答
嘿,我来帮你搞定这个状态机的类型声明问题,还有你问的函数返回自身指针的疑问~
一、解决std::function的类型声明问题
你遇到的核心问题是递归类型的std::function声明——每个状态函数接受float参数,返回一个同类型的状态函数。C++11及以后的std::function支持这种递归的类型定义,我们可以用using先定义一个类型别名来打破循环依赖:
#include <functional> class Widget { public: void update(float time_interval){ current_state_ = current_state_(time_interval); } private: // 先定义状态函数的类型:接受float,返回同类型的std::function using StateFunction = std::function<StateFunction(float)>; // 声明各个状态函数 StateFunction off_(float); StateFunction standby_(float); StateFunction locked_(float); StateFunction current_state_; // 初始化时可以赋值为off_,比如在构造函数里 }; // 举个状态函数的实现例子 Widget::StateFunction Widget::off_(float time_interval) { // 这里写off状态的逻辑,比如判断是否要切换状态 if (/* 触发切换到standby的条件 */) { return standby_; } // 没有切换就保持当前状态 return off_; }
这样声明后,每个状态函数都能正确返回下一个状态的函数对象,完美适配你的状态机逻辑。
二、函数能否返回自身类型的指针?
当然可以!不过直接写会有语法问题,需要用类型别名来辅助声明:
1. 自由函数/静态成员函数的情况
// 先定义函数指针的别名 using StateFuncPtr = StateFuncPtr(*)(float); // 定义一个状态函数,返回自身指针 StateFuncPtr off_func(float time_interval) { // 状态逻辑... return off_func; // 直接返回自身的指针 }
2. 非静态成员函数的情况
成员函数指针的语法更复杂,因为要包含类的作用域。如果想用成员函数指针实现,需要这样:
class Widget; using MemberStateFuncPtr = MemberStateFuncPtr(Widget::*)(float); class Widget { public: MemberStateFuncPtr off_(float) { // 逻辑... return &Widget::off_; } };
不过对比下来,std::function的方式更灵活——它不仅能容纳普通函数/成员函数指针,还能捕获上下文的lambda表达式,对于极简状态机来说是更优的选择。
内容的提问来源于stack exchange,提问作者Jack Deeth
相关产品推荐
相关产品推荐

