将字符串求值为类变量

Evaluate string to class variable

本文关键字:类变量 字符串      更新时间:2023-10-16

我需要计算一个字符串,这样我就可以给一个类变量赋值:

类:

class DATACLASS {
public:
    double variable1, variable2, variable3;
};

void init():

void init() 
{
    DATACLASS *d = new DATACLASS;
    std::string ssList[3] = {"variable1", 
                             "variable2", 
                             "variable3"};                        
    for(unsigned i = 0; i < 3; ++i)
    {
      std::stringstream ss;
      ss << ssList[i];
      //ss.str().c_str() correspond to "variable1", "variable2", "variable3"
      mxArray *array_ptr = mexGetVariable("base", ss.str().c_str());
      double pr = (double)mxGetPr(array_ptr)[0];
      // How to make the same thing here?
      // I would like to have something that would evaluate
      // data->ssList[i] = pr;
      // or more precisely      
      // data->variable1 = pr;
      // but from the ss string like below (but this doesn't work)
      data->ss.str().c_str() = pr;
    }

当我尝试这样做时,会得到这样的错误:

error C2039: 'ss' : is not a member of 'DATACLASS'

这是无效的c++。编译器认为你要做的是访问DATACLASS的一个名为ss的实例的成员,并在其上调用一些方法。

你想做的事情可以在反射中完成,这在c++中是不支持的。您可以通过使用模板使用某种形式的伪反射模型来减半它。

你只读双精度吗?可以使用指向数据成员的指针。

    std::map<std::string, double DATACLASS::*> aMembers;
    aMembers["variable1"] = &DATACLASS::variable1;
    aMembers["variable2"] = &DATACLASS::variable2;
    aMembers["variable3"] = &DATACLASS::variable3;
    DATACLASS dc;
    std::string sData = "variable1";
    dc.*aMembers[sData] = 10;

在一个完整的解决方案中,你当然必须首先检查members [sData]是否存在。如果需要支持多种数据类型,则需要使用模板并编写一些支持类。不过,这应该是可行的。

不需要大量努力的最接近的方法是如下所示。您可以使用宏、函数、容器、模板、指针/引用等抽象出一些东西,但这是基本要点。除非你有一个令人信服的理由,否则我不建议你这么做,也不建议你花时间去做。你的最终目标是什么?

class DATACLASS {
public:
    double variable1, variable2, variable3;
};
void init() 
{
    DATACLASS *d = new DATACLASS;
    std::string ssList[3] = {"variable1", 
                             "variable2", 
                             "variable3"};                        
    for(unsigned i = 0; i < 3; ++i)
    {
      std::stringstream ss;
      ss << ssList[i];
      //ss.str().c_str() correspond to "variable1", "variable2", "variable3"
      mxArray *array_ptr = mexGetVariable("base", ss.str().c_str());
      double pr = (double)mxGetPr(array_ptr)[0];
      if(ss.str() == "variable1")
        data->variable1 = pr;
      else if(ss.str() == "variable2")
        data->variable2 = pr;
      else if(ss.str() == "variable3")
        data->variable3 = pr;
    }
}