合并 static_cast 和 std::any_cast
Combining static_cast and std::any_cast
有安全的std::any_cast
和static_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
.
有安全的std::any_cast
和static_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
.