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

如何使用std::any_cast转换std::any存储的匿名枚举为int类型

问题背景

我有一个存储std::any元素的队列,在获知所有传入元素的具体类型前,会通过可变参数方式向队列填充元素,目前需要在填充过程中将传入的所有匿名(未命名)枚举值统一转换为int类型后再存入队列。

现有示例代码
enum {
    VALUE_1,
    VALUE_2,
};

enum {
    VALUE_3
};

template<typename ...T>
std::queue<std::any> extract_variadic_to_queue_impl(const T&... args) {
    std::vector<std::any> vec = { args ... };
    std::queue<std::any> ret;
    for (unsigned int i = 0, max = vec.size(); i < max; i++) {
        std::string type_name = vec[i].type().name();
        if (type_name.starts_with("enum <unnamed-enum>")) {
            ret.push((int)std::any_cast<???>(vec[i]));
        }
        else {
            ret.push(vec[i]);
        }
    }
    return ret;
}

template<typename ...T>
std::queue<std::any> extract_variadic_to_queue(T... args) {
     return extract_variadic_to_queue_impl(std::any(args)...);
}

#define EXTRACT(var_name, type) type var_name = std::any_cast<type>(q.front()); q.pop();

void test() {
    std::queue<std::any> q = extract_variadic_to_queue(
        0, 
        "hi", 
        VALUE_2, 
        2.0f, 
        2.0
    );
    EXTRACT(my_int, int);
    EXTRACT(my_string, const char*);
    EXTRACT(my_constant, int);
    EXTRACT(my_float, float);
    EXTRACT(my_double, double);
}
待解疑问
  • 我已知当前编译环境下所有匿名枚举的type_name返回值格式为enum <unnamed-enum>-拼接该枚举首个枚举值的名称(例如此处第一个枚举的type_name为enum <unnamed-enum>-VALUE_1)。假设我无法为这些匿名枚举显式命名,请问需要将代码中的???替换为什么内容才能实现需求?
  • 我已知直接填入int是不可行的:如果不在extract_variadic_to_queue_impl中对匿名枚举做特殊处理,执行EXTRACT(my_constant, int);会抛出bad_any_cast异常,但既然std::any可以存储该值,理应存在合法的取值方式,对吗?
  • 如果将test()修改为如下形式,同时传入两个不同匿名枚举的枚举值,实现逻辑是否需要调整?

修改后的测试代码如下:

void test() {
    std::queue<std::any> q = extract_variadic_to_queue(
        0,
        "hi", 
        VALUE_2, 
        2.0f, 
        2.0, 
        VALUE_3 // 传入两个不同匿名枚举的值
    );
    EXTRACT(my_int, int);
    EXTRACT(my_string, const char*);
    EXTRACT(my_constant, int);
    EXTRACT(my_float, float);
    EXTRACT(my_double, double);
    EXTRACT(my_other_constant, int);
}

内容的提问来源于stack exchange,提问作者Henry Nissen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:31:04