将std :: any转换为未知类型

时间:2017-10-17 01:20:39

标签: c++ c++17

如果我有std::any std::stringint,我怎么能将其转换为包含的类型?

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;
}

2 个答案:

答案 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内容的某些操作,同时仍然忘记存储的类型。

如果您确实有这样的可能类型列表,请考虑使用variantany存在于狭窄的窗口中,您不知道在容器设计时存储的类型,但在插入和移除时都会这样做。

在那个狭窄的窗口中,您可以根据存储的typeid进行运行时测试,并使用any_cast强制转换为已知类型。