C ++可以将字符串值转换为类型
c++ can one turn a string value into a type?
我正在尝试编写一些通用代码:
int _pID = _plant->getPlantInternalID();
std::string _plantName = getPlantBasedUponInternalID(_pID);
_plantName
返回一串植物,如Broccoli
但是有没有办法做这样的事情:
for (int f=0; f < _f.getPlants().size(); f++)
{
std::shared_ptr<Plant> sbas = _f.getPlants().at(f);
std::shared_ptr<_plantName> sder2 = std::dynamic_pointer_cast<_plantName>(sbas);
}
请注意,我正在输入_plantName
但实际上我需要执行以下操作:
std::shared_ptr<Broccoli> sder2 = std::dynamic_pointer_cast<Broccoli>(sbas);
需要做什么才能做这样的事情,我该如何完成它?
更新:我只是根据我编造的内部ID获取ID:
std::string HUDForStatus::getPlantBasedUponInternalID(int _id)
{
switch (_id)
{
case 114: // Asparagus
return ASPARAGUS::plantName.c_str();
break;
case 113: // Beets
return BEETS::plantName.c_str();
break;
case 115: // Bok Choy
return BOKCHOY::plantName.c_str();
break;
case 107: // Broccoli
return BROCCOLI::plantName.c_str();
break;
case 101: // Carrot
return CARROT::plantName.c_str();
break;
case 110: // Celery
return CELERY::plantName.c_str();
break;
case 103: // Corn
return CORN::plantName.c_str();
break;
case 116: // Eggplant
return EGGPLANT::plantName.c_str();
break;
case 102: // Green Beans
return GREENBEANS::plantName.c_str();
break;
... <snip>...
}
}
这不是
解决问题C++方法。相反,给Plant
一个适当的抽象接口,然后你不需要知道你正在使用哪种具体类型。相反,您只需使用界面,让虚拟调度决定它是哪个工厂以及调用哪个实现。
std::shared_ptr<T> std::dynamic_pointer_cast<std::shared_ptr<U>& sp >
只能在以下情况下工作
dynamic_cast<T*>(sp.get())
会工作。所以在你的情况下
std::shared_ptr<_plantName> sder2 = std::dynamic_pointer_cast<_plantName>(sbas);
转换为std::string
Plant*
应通过 dynamic_cast
有效。为此,std::string
应该从 Plant 派生,这也意味着这些类型应该是多态的(为此需要一些虚函数(,因为 dynamic_cast
运算符使用从多态类生成的运行时类型信息。但这是不可能的。
溶液:
1.从Plant
派生您的类 - 然后像
std::shared_ptr<Broccoli> sder2 = std::dynamic_pointer_cast<Broccoli>(sbas);
将是可能的。 这可能会有所帮助。
2.使用Plant
将实现的抽象接口。然后,您将使用此接口中的方法在运行时执行动态类型标识
C++ 是静态类型语言,不可能在运行时创建某种随机类型的变量。如果您的类具有公共接口,则可以执行此操作,如末尾的示例所示。
使用 typeid 在运行时获取类型的唯一名称很容易。
#include <iostream>
#include <string>
#include <typeinfo>
#include <memory>
struct B
{
virtual ~B(){}
virtual void foo() = 0;
};
struct A1 : B
{
virtual void foo()
{
std::cout << 1 << std::endl;
}
};
struct A2 : B
{
virtual void foo()
{
std::cout << 2 << std::endl;
}
};
std::unique_ptr<B> getFooCaller( const std::string v )
{
if ( v==typeid(A1()).name() )
{
return std::unique_ptr<B>(new A1);
}
else if ( v==typeid(A2()).name() )
{
return std::unique_ptr<B>(new A2);
}
return 0;
}
int main(int argc, char* argv[])
{
if (argc!=2)
{
std::cout << "pass type name" << std::endl;
}
auto b = getFooCaller(argv[1]);
if (b)
{
b->foo();
}
else
{
std::cout << "expecting " << typeid(A2()).name() <<" or " << typeid(A2()).name() << std::endl;
}
}
相关文章:
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值