在结构 C++ 中动态访问变量
Dynamically Access Variable Inside a Struct C++
我是 C++ 的新手,对如何处理这个问题很困惑。在 Javascript 中,我可以做这样的事情来非常容易地动态访问对象:
function someItem(prop) {
const item = {
prop1: 'hey',
prop2: 'hello'
};
return item[prop];
}
在 C++ 中,我假设我必须使用 Struct,但在那之后我陷入了如何动态访问结构成员变量的问题。
void SomeItem(Property Prop)
{
struct Item
{
Proper Prop1;
Proper Prop2;
};
// Item[Prop] ??
}
这可能是糟糕的代码,但我对如何处理它感到很困惑。
如评论中所述,在 C++ 中,您不会为此定义自定义结构,而是使用 std::unordered_map
。我不知道 Javascript,但如果 Property
是一个枚举(它可能是经过小修改的其他东西)并且 return item[prop];
应该是 return 一个字符串,那么这个可能接近:
#include <string>
#include <unordered_map>
#include <iostream>
enum class Property { prop1,prop2};
std::string someItem(Property p){
const std::unordered_map<Property,std::string> item{
{Property::prop1,"hey"},
{Property::prop2,"hello"}
};
auto it = item.find(p);
if (it == item.end()) throw "unknown prop";
return it->second;
}
int main(){
std::cout << someItem(Property::prop1);
}
std::unordered_map
确实有一个 operator[]
,您可以像这样使用 return item[p];
,但是当为给定键找到 none 时,它会在映射中插入一个元素.这并不总是可取的,当地图为 const
.
时也不可能。
这是一个简单的示例,说明如何创建 struct
的实例,然后访问其成员:
#include <iostream>
#include <string>
struct Item {
std::string prop1 = "hey";
std::string prop2 = "hello";
};
int main() {
Item myItem;
std::cout << myItem.prop1 << std::endl; // This prints "hey"
std::cout << myItem.prop2 << std::endl; // This prints "hello"
return 0;
}
如评论中所述,您可能需要一张地图。映射具有与其关联的键和值,例如,您可以将键 "prop1"
与值 "hey"
:
关联
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, std::string> myMap;
myMap["prop1"] = "hey";
myMap["prop2"] = "hello";
std::cout << myMap["prop1"] << std::endl; // This print "hey"
std::cout << myMap["prop2"] << std::endl; // This print "hello"
return 0;
}
第一个被认为是 C++ 中的“正常”struct
用法,另一个更适用于必须按键查找的情况
我是 C++ 的新手,对如何处理这个问题很困惑。在 Javascript 中,我可以做这样的事情来非常容易地动态访问对象:
function someItem(prop) {
const item = {
prop1: 'hey',
prop2: 'hello'
};
return item[prop];
}
在 C++ 中,我假设我必须使用 Struct,但在那之后我陷入了如何动态访问结构成员变量的问题。
void SomeItem(Property Prop)
{
struct Item
{
Proper Prop1;
Proper Prop2;
};
// Item[Prop] ??
}
这可能是糟糕的代码,但我对如何处理它感到很困惑。
如评论中所述,在 C++ 中,您不会为此定义自定义结构,而是使用 std::unordered_map
。我不知道 Javascript,但如果 Property
是一个枚举(它可能是经过小修改的其他东西)并且 return item[prop];
应该是 return 一个字符串,那么这个可能接近:
#include <string>
#include <unordered_map>
#include <iostream>
enum class Property { prop1,prop2};
std::string someItem(Property p){
const std::unordered_map<Property,std::string> item{
{Property::prop1,"hey"},
{Property::prop2,"hello"}
};
auto it = item.find(p);
if (it == item.end()) throw "unknown prop";
return it->second;
}
int main(){
std::cout << someItem(Property::prop1);
}
std::unordered_map
确实有一个 operator[]
,您可以像这样使用 return item[p];
,但是当为给定键找到 none 时,它会在映射中插入一个元素.这并不总是可取的,当地图为 const
.
这是一个简单的示例,说明如何创建 struct
的实例,然后访问其成员:
#include <iostream>
#include <string>
struct Item {
std::string prop1 = "hey";
std::string prop2 = "hello";
};
int main() {
Item myItem;
std::cout << myItem.prop1 << std::endl; // This prints "hey"
std::cout << myItem.prop2 << std::endl; // This prints "hello"
return 0;
}
如评论中所述,您可能需要一张地图。映射具有与其关联的键和值,例如,您可以将键 "prop1"
与值 "hey"
:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, std::string> myMap;
myMap["prop1"] = "hey";
myMap["prop2"] = "hello";
std::cout << myMap["prop1"] << std::endl; // This print "hey"
std::cout << myMap["prop2"] << std::endl; // This print "hello"
return 0;
}
第一个被认为是 C++ 中的“正常”struct
用法,另一个更适用于必须按键查找的情况