使用变量来确定struct成员

时间:2016-01-07 19:41:34

标签: c++

在我的代码中,我使用了以下结构的多个结构:

struct Track {
    string artist;                      
    string cd;                          
    // etc....  
};

结构可以称为:Track1,Track2等。
我正在尝试创建一个使用变量来确定应该输出哪个成员的函数 例如:

string x ="cd"                                
cout << Track1.x << endl;

我无法弄清楚如何做到这一点......我不断得到'x'不是Struct的成员的错误。

感谢您花时间阅读本文,希望您能帮助我。

2 个答案:

答案 0 :(得分:7)

C ++不是一种脚本语言,所以你不能做变量变量&#34;那样的。

通常的方法是使用地图:

std::map<std::string, std::string> myValues;

然后以下是相同的:

std::cout << myValues["cd"] << std::endl;

std::string x = "cd";
std::cout << myValues[x] << std::endl;

然而,我质疑你的设计。看起来轨道具有固定数量的属性,因此单个成员有意义,而不是可以添加和删除元素的地图。您可以限制对地图的访问并编写代码,以确保其始终存储所有轨道属性(而不是其他任何内容)。

但我建议重新考虑变量&#34;变量&#34;这里首先。将字符串传递给函数以确定其语义并不是特别有效,强大或有弹性。为什么不返回对整个Track对象的引用,然后调用者可以检查他们想要的任何属性?

std::cout << getTrack(arguments...).cd << std::endl;

答案 1 :(得分:0)

无法通过运行时名称指定类成员。唯一的直接语言功能,允许用户通过运行时值指定一个类成员(即你把它放在&#34;使用一个变量来确定结构成员&#34;)是&#34;指针指向的指针-member&#34;型

Track track1 = { "Some Artist", "Some CD" };
Track track2 = { "Some Other Artist", "Some Other CD" };

std::string Track::*member = &Track::cd; // pointer-to-member points to 'cd' member
std::cout << track1.*member << std::endl;
std::cout << track2.*member << std::endl;

member = &Track::artist; // pointer-to-member points to 'artist' member
std::cout << track1.*member << std::endl;
std::cout << track2.*member << std::endl;

现在,如果您希望能够使用包含其名称的字符串(如原始帖子中)选择特定成员,则除了手动实现名称到成员映射之外别无选择。您可以使用上述指向成员的指针来构建此类映射

std::map<std::string, std::string Track::*> mapping = {
  { "artist", &Track::artist },
  { "cd", &Track::cd }
};

std::string Track::*member = mapping["cd"];
std::cout << track1.*member << std::endl;
std::cout << track2.*member << std::endl;