合并 static_cast 和 std::any_cast

Combining static_cast and std::any_cast

有安全的std::any_caststatic_cast组合吗?

我正在尝试执行以下操作:

#include <any>
#include <iostream>

int main( )
{
    auto x = std::make_any< int >( 5 );
#if 0 // doesn't work
    std::cout << std::any_cast< short >( x );
#else // works, but requires knowing the initial type
    std::cout << static_cast< short >( std::any_cast< int >( x ) );
#endif
}

std::any 中获取值的唯一方法是 any_cast<T>,其中 T 与内部值具有相同的 typeid(您可以使用 .type()方法)。

如果您需要其他语义,例如“取一个值,如果它可以转换为 int”,你必须使用其他东西来进行类型擦除。比如你自己写一个。

事实是,std::any 无法理解存储的数据。

你可能会认为有一个成员函数type(),所以std::any可以知道类型。但实际上,这并没有帮助,因为您对 type() 的结果唯一可以做的就是将它与其他 typeid 进行比较。也就是说,您必须已经知道要检查的是哪种类型。 因此,std::any 无法真正回答“您携带哪种类型?”的问题;它只能回答“你携带这种X吗?”的问题。

后者在你调用std::any_cast<short>时发生:std::any只知道它不携带一个short,但它并不知道它携带一个可转换的类型至 short.