如果我有std::any
std::string
或int
,我怎么能将其转换为包含的类型?
std::any
上有type
,但我无法使用此类型投放。
示例:
#include <any>
#include <iostream>
#include <string>
int main(void) {
std::any test = "things";
std::any test2 = 123;
// These don't work
std::string the_value = (std::string) test;
int the_value2 = (int) test2;
std::cout << the_value << std::endl;
std::cout << the_value2 << std::endl;
}
答案 0 :(得分:9)
您使用any_cast
来完成这项工作。例如
auto a = std::any(12);
std::cout << std::any_cast<int>(a) << '\n';
您可以从cppreference
中找到更多详情如果您想动态将值转换为std::any
,您可以尝试
if (a.type() == typeid(int)) {
cout << std::any_cast<int>(a) << endl;
} else if (a.type() == typeid(float)) {
cout << std::any_cast<float>(a) << endl;
}
答案 1 :(得分:6)
如果你没有任何类型的列表,其中any包含一个,你不能将any转换为它的类型并以它的实际类型进行操作。
您可以将一个类型存储在any中,并将该类型的操作存储为任何类型的函数指针。但这必须在存储时或当做有一个存储在any中的可能类型的列表(可能包含1个元素)时完成。
C ++ 不在any中存储足够的信息,以便在将值存储在any中时允许在该类型上编译任意代码。 C ++在运行时不允许完全“具体化”。
Type erasing type erasure, `any` questions? Q&amp; A由一个名不见经传的stackoverflow用户提供了一个示例,说明如何记住对any
内容的某些操作,同时仍然忘记存储的类型。
如果您确实有这样的可能类型列表,请考虑使用variant
。 any
存在于狭窄的窗口中,您不知道在容器设计时存储的类型,但在插入和移除时都会这样做。
在那个狭窄的窗口中,您可以根据存储的typeid进行运行时测试,并使用any_cast
强制转换为已知类型。