如何使用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
相关产品推荐
相关产品推荐

