检查std :: any变量是否持有std :: string时出现问题

Pat*_*zer 1 c++ string types

在c ++中,您可以比较两个type_info对象。

std::any班。它具有一个成员.type(),该成员还将返回一个type_info对象,告诉您其包含的类型。我可以使用typeid(THE_TYPE)并比较两者。

以下代码有效:

std::any x = 6;

if (x.type() == typeid(int)) {
    cout << "x is int";
}
Run Code Online (Sandbox Code Playgroud)

但是以下操作无效:

std::any x = "string literal";

if (x.type() == typeid(std::string)) {
    cout << "x is string";
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何检查变量是否为字符串?

son*_*yao 7

问题是,"string literal"不是type std::string,而是c风格的字符串,即const char[15]本身。并将std::any其作为const char*。因此,如果您按以下方式更改条件,您将被"x is string"打印出来。

if (x.type() == typeid(const char*))
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以将传递std::stringstd::any

std::any x = std::string("string literal");
Run Code Online (Sandbox Code Playgroud)

或使用文字

using namespace std::string_literals;
std::any x = "string literal"s;
Run Code Online (Sandbox Code Playgroud)