0

我需要评估一个字符串,以便为类变量赋值:

班级 :

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

无效的 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'
4

3 回答 3

0

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

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;
    }
}
于 2013-05-31T18:59:12.703 回答
0

你只看双打吗?为此,您可以使用指向数据成员的指针。

    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;

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

于 2013-05-31T19:00:20.510 回答
0

那不是有效的 C++。编译器认为您正在尝试做的是访问被调用实例的成员DATACLASSss在其上调用一些方法。

您尝试做的事情可以在反射中完成,这在 C++ 中不受支持。您可以通过使用模板使用某种形式的伪反射模型来半途而废。

于 2013-05-31T18:40:12.200 回答