我需要评估一个字符串,以便为类变量赋值:
班级:
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'
答案 0 :(得分:0)
这不是有效的C ++。编译器认为您尝试执行的操作是访问名为DATACLASS
的{{1}}实例的成员,并在其上调用一些方法。
您尝试做的事情可以在反射中完成,而C ++不支持。您可以使用模板使用某种形式的伪反射模型来对其进行半拍。
答案 1 :(得分: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;
}
}
答案 2 :(得分: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]是否存在。如果需要支持多种数据类型,则需要使用模板并编写一些支持类。不过,这应该是可行的。