gpt4 book ai didi

c++ - 在 C++ 中有没有办法将 "compare"为带有类型名的字符串?

转载 作者:行者123 更新时间:2023-12-05 03:31:02 27 4
gpt4 key购买 nike

我有一个带有初始值的 json 和一个创建对象的管理器。这些值被读取为字符串,但管理器需要类型名称来创建对象。

我有这样的东西

for(auto obj_str : json["objs"])
{
if(obj_str == "ObjectFoo")
{
manager.createObject<ObjectFoo>();
}
if(obj_str == "ObjectBar")
{
manager.createObject<ObjectBar>();
}
if(obj_str == "ObjectBaz")
{
manager.createObject<ObjectBaz>();
}
}

有没有一种方法可以避免对每个具有一个或多个通用函数的对象使用 if 语句?对象的字符串始终与类型名相同。

最佳答案

虽然可能有一些不涉及 if 语句的其他方法,但必须在某个地方以某种形式或方式在字符串和离散类型之间进行转换.

这是 C++ 的基础:所有对象和表达式的类型都必须在编译时已知并确定。这是一条硬性的、不变的规则,没有异常(exception),而且您正在运行这个基本的、核心的 C++ 原则。

代替 if 语句,其他可能性包括关联容器,它将类名映射到闭包,闭包实例化给定类型的对象,或接收任何此 manager object 作为参数,并使用关联的类名调用管理器的模板方法。

或者可能有一些完全在 C++ 之外的东西,某种脚本,它以某种结构化的格式读取配置文件,并喷出由上述 if 组成的机器人生成的 C++ 代码语句,然后集成到您的开发构建系统中,以便在需要时自动构建和重建。

但对您的问题的简短回答是:不幸的是,不,C++ 不能以这种方式工作。 obj_str 的值直到运行时才知道。任何 C++ 表达式或语句使用的类型必须在编译时已知,仅此而已。没有办法调和这种根本的脱节。以某种形式或方式,您将需要实现代码和逻辑来检查和验证每个可能值的 obj_str 并相应地实例化适当的类型。

关于c++ - 在 C++ 中有没有办法将 "compare"为带有类型名的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70717269/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com