You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数能否返回自身类型指针?类内有限状态机函数声明困惑

极简有限状态机的函数声明方案 & 函数返回自身指针的疑问解答

嘿,我来帮你搞定这个状态机的类型声明问题,还有你问的函数返回自身指针的疑问~

一、解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:13:06