有没有一种方法可以将std :: any转换为原始类型而不必对其进行硬编码?
我知道你可以做
std::any_cast<int>(example)
但这要求您已经知道“ example”是一个int。我注意到std :: any存储了原始类型,但我似乎还是找不到使用它进行转换的方法。我想做这样的事情:
static_cast<example.type()>(example);
对不起,如果这是一个基本问题,但我觉得这可能是不可能的,并希望进行检查。
答案 0 :(得分:6)
否,因为强制类型转换的类型必须在编译时已知,并且std::any
实例中保存的类型在运行时是已知的。
我想在这里指出std::any
用例非常有限。您可能永远不要在面向最终用户的代码中使用它。它的作用是void*
的类型安全的替代方法。我可以想到的一个用例是在某个类型擦除类的实现中,该类以前使用过void*
(也许像std::function
之类)。
请仔细考虑std::any
是否真的是您所需要的。
答案 1 :(得分:0)
我最近也在考虑这个。我们希望 std::any 有一个方法来获取返回 type_info 的原始类型。但这现在无法实现,除非C++像Java一样添加动态特性或运行时反射。
但我想出了一个解决方法。我们将“操作”存储在 std::function 中,而不是将数据存储在 std::any 中。
假设我们要存储不同的数据,稍后将它们打印并写入文件。
//Solution1 use std::any
temlate<typename... T>
std::vector<std::any> prepare_data(T... t);
auto data=prepare_data(10,-1,0.5,3.3,"abcd",....);
//....
void print_and_write(std::vector<std::any> data)
{
for (....)
{
print(...)
write(...)
}
}
//Solution2 use std::function
temlate<typename... T>
std::vector<std::function<void(void)>> prepare_data(T... t);
auto operation=[](auto data){print(data);write(data);};
auto data=prepare_data(
std::bind(operation,10),
std::bind(operation,3.3),
std::bind(operation,"abcd"),
...........
);
void print_and_write(std::vector<std::function<void(void)>> data)
{
for(...)
{
data[i]();//perform the lambda
}
}