C++状态机

#include <iostream>
#include <unordered_map>
#include <string>

enum class PaymentEvent {
    PAY_CREATE,
    PAY_PROCESS,
    PAY_SUCCESS,
    PAY_FAIL
};

class PaymentStatus {
public:
    // 枚举状态
    enum Status {
        INIT,
        PAYING,
        PAID,
        FAILED
    };

    // 构造函数
    PaymentStatus(Status status, const std::string& description)
        : status(status), description(description) {}

    // 获取目标状态
    static Status getTargetStatus(Status sourceStatus, PaymentEvent event);

    // 打印状态信息
    void printStatus() const {
        std::cout << "Status: " << description << std::endl;
    }

private:
    Status status;
    std::string description;
};

// 自定义哈希函数
namespace std {
    template <>
    struct hash<std::pair<PaymentStatus::Status, PaymentEvent>> {
        size_t operator()(const std::pair<PaymentStatus::Status, PaymentEvent>& p) const {
            // 一种简单的哈希组合方法
            return std::hash<int>()(static_cast<int>(p.first)) ^ std::hash<int>()(static_cast<int>(p.second));
        }
    };
}

// 静态映射表,存储状态转换
std::unordered_map<std::pair<PaymentStatus::Status, PaymentEvent>, PaymentStatus::Status> stateTransitions = {
    {{PaymentStatus::INIT, PaymentEvent::PAY_CREATE}, PaymentStatus::PAYING},
    {{PaymentStatus::PAYING, PaymentEvent::PAY_PROCESS}, PaymentStatus::PAID},
    {{PaymentStatus::PAYING, PaymentEvent::PAY_FAIL}, PaymentStatus::FAILED}
    // 添加其他状态转换
};

// 获取目标状态的静态方法实现
PaymentStatus::Status PaymentStatus::getTargetStatus(Status sourceStatus, PaymentEvent event) {
    auto it = stateTransitions.find({sourceStatus, event});
    if (it != stateTransitions.end()) {
        return it->second;
    } else {
        return sourceStatus; // 默认情况下保持原状态
    }
}

int main() {
    PaymentStatus paymentStatusInit(PaymentStatus::INIT, "初始化");
    PaymentStatus paymentStatusPaying(PaymentStatus::PAYING, "支付中");
    PaymentStatus paymentStatusPaid(PaymentStatus::PAID, "支付成功");
    PaymentStatus paymentStatusFailed(PaymentStatus::FAILED, "支付失败");

    paymentStatusInit.printStatus();

    PaymentStatus::Status newStatus = PaymentStatus::getTargetStatus(PaymentStatus::INIT, PaymentEvent::PAY_CREATE);
    paymentStatusPaying = PaymentStatus(newStatus, "支付中");

    paymentStatusPaying.printStatus();

    return 0;
}