使用する用語がわからないため、コードから始める必要があります。私が次のコードを持っているとしましょう:
class Node
{
public:
void Parse(rapidxml::xml_node<> *node)
{
for (rapidxml::xml_attribute<> *attr = node->first_attribute();
attr;
attr = attr->next_attribute())
{
std::stringstream converter;
converter << attr->value();
if( !strcmp(attr->name(), "x") ) converter >> x;
else if( !strcmp(attr->name(),"y") ) converter >> y;
else if( !strcmp(attr->name(), "z") ) converter >> z;
}
}
private:
float x;
float y;
float z;
};
私が我慢できないのは、if(!strcmp(attr-> name()、 "x"))converter>>x;の繰り返しです。これはエラーが発生しやすく単調であると感じますが、文字列値をメンバーの割り当てにマップする別の方法は考えられません。このようなコードを回避するために取ることができる他のいくつかのアプローチは何ですか?私が考えることができる他の唯一の可能な代替案はハッシュマップを使用することでしたが、それはコールバックで問題にぶつかります
これは私が思いつくことができる最高のものですが、私が望むほど柔軟ではありません:
class Node
{
Node() : x(0.0f), y(0.0f), z(0.0f)
{
assignmentMap["x"] = &x;
assignmentMap["y"] = &y;
assignmentMap["z"] = &z;
}
public:
void Parse(rapidxml::xml_node<> *node)
{
for (rapidxml::xml_attribute<> *attr = node->first_attribute();
attr;
attr = attr->next_attribute())
{
map<std::string, float*>::iterator member = assignmentMap.find(attr->name());
//check for a pre-existing entry
if( member == assignmentMap.end()) continue;
std::stringstream converter;
converter << attr->value();
converter >> *(member->second);
}
}
private:
float x;
float y;
float z;
std::map<std::string, float*> assignmentMap;
};