bad_any_cast 从模板函数返回字符串时出现异常
bad_any_cast exception when returning string from templated function
我正在创建一个配置文件解析器,其值存储在 unordered_map 中。配置值是字符串、整数、浮点数和布尔值的混合,所以我使用 std::any 将它们存储在无序映射中,如下所示:
static unordered_map<string, any> CONFIG_VALUES =
{
{"title", "The window title"},
{"xRes", 1024},
//...
};
我有一个通用的 getter 函数来允许像这样检索配置值:
template<typename T>
T GetValue(const string& valueName) const
{
auto result = CONFIG_VALUES.find(valueName);
if (result != CONFIG_VALUES.end())
{
return any_cast<T>(result->second);
}
else
{
throw std::runtime_error("Invalid config key");
}
}
我的代码可以编译,并且我能够像这样成功检索一个 int:
int myXres = MyConfig->GetValue<int>("xRes");
但是,如果我尝试获取字符串:
string myTitle = MyConfig->GetValue<string>("title");
我崩溃了:
Unhandled exception at 0x00007FF99463A799 in program.exe: Microsoft C++ exception: std::bad_any_cast at memory location 0x000000DCD76FDCE8. occurred
在 Visual Studio 调试器局部变量中,我看到字符串的 std::any 类型是
type 0x00007ff6950f2328 {program.exe!char const * `RTTI Type Descriptor'} {_Data={_UndecoratedName=0x0000000000000000 <NULL> ...} }
我怀疑 "char const *" 可能是这里的问题(因为我们将 "string" 作为模板参数传递),但我不确定如何解决它...(或者,也许这是一条红鲱鱼)。
有什么想法吗?
你说的值是 char const*
是对的。您需要将其作为 std::string
存储在地图中,如下所示:
static unordered_map<string, any> CONFIG_VALUES =
{
{"title", std::string("The window title")},
{"xRes", 1024},
//...
};
或者,您可以将 any_cast
设置为正确的类型,如下所示:
string myTitle = GetValue<char const*>("title");
这是一个有效的 demo。
我正在创建一个配置文件解析器,其值存储在 unordered_map 中。配置值是字符串、整数、浮点数和布尔值的混合,所以我使用 std::any 将它们存储在无序映射中,如下所示:
static unordered_map<string, any> CONFIG_VALUES =
{
{"title", "The window title"},
{"xRes", 1024},
//...
};
我有一个通用的 getter 函数来允许像这样检索配置值:
template<typename T>
T GetValue(const string& valueName) const
{
auto result = CONFIG_VALUES.find(valueName);
if (result != CONFIG_VALUES.end())
{
return any_cast<T>(result->second);
}
else
{
throw std::runtime_error("Invalid config key");
}
}
我的代码可以编译,并且我能够像这样成功检索一个 int:
int myXres = MyConfig->GetValue<int>("xRes");
但是,如果我尝试获取字符串:
string myTitle = MyConfig->GetValue<string>("title");
我崩溃了:
Unhandled exception at 0x00007FF99463A799 in program.exe: Microsoft C++ exception: std::bad_any_cast at memory location 0x000000DCD76FDCE8. occurred
在 Visual Studio 调试器局部变量中,我看到字符串的 std::any 类型是
type 0x00007ff6950f2328 {program.exe!char const * `RTTI Type Descriptor'} {_Data={_UndecoratedName=0x0000000000000000 <NULL> ...} }
我怀疑 "char const *" 可能是这里的问题(因为我们将 "string" 作为模板参数传递),但我不确定如何解决它...(或者,也许这是一条红鲱鱼)。
有什么想法吗?
你说的值是 char const*
是对的。您需要将其作为 std::string
存储在地图中,如下所示:
static unordered_map<string, any> CONFIG_VALUES =
{
{"title", std::string("The window title")},
{"xRes", 1024},
//...
};
或者,您可以将 any_cast
设置为正确的类型,如下所示:
string myTitle = GetValue<char const*>("title");
这是一个有效的 demo。