C ++可以将字符串值转换为类型

c++ can one turn a string value into a type?

本文关键字:转换 类型 字符串      更新时间:2023-10-16

我正在尝试编写一些通用代码:

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