是否将std ::: cast还原为原始类型?

时间:2018-10-30 01:36:15

标签: c++ casting std c++17

有没有一种方法可以将std :: any转换为原始类型而不必对其进行硬编码?

我知道你可以做

std::any_cast<int>(example)

但这要求您已经知道“ example”是一个int。我注意到std :: any存储了原始类型,但我似乎还是找不到使用它进行转换的方法。我想做这样的事情:

static_cast<example.type()>(example);

对不起,如果这是一个基本问题,但我觉得这可能是不可能的,并希望进行检查。

2 个答案:

答案 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
    }
}