【问题标题】:Access a member in a struct via a variable in C++通过 C++ 中的变量访问结构中的成员
【发布时间】:2020-04-01 23:35:25
【问题描述】:

我有一个包含两个成员的结构,例如:

struct DataSet {
    int x;
    int y;
};

...,我必须在一个方法中访问它们,但一次只能访问一个,例如:

void foo(StructMember dsm) { // ("StructMember" does not exist)
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.dsm * ds.dsm << std::endl;
}
foo(x);
foo(y);

我希望得到的输出:

16
36

当我必须解决这样的问题时,我应该怎么做?是否有可以访问成员的数据类型?

【问题讨论】:

  • 我唯一能想到的就是你可以使用指针算法。您可以将相对于结构开头的偏移量作为结构“成员”传递。这将取决于成员的大小。对于整数,我认为您可以保证它们与字边界对齐,因此您可以通过dsm = 0 访问xdsm = 4 访问y,然后您可以像int val = int(*(&amp;ds+dsm)) 一样访问它们。
  • @ocket8888 c++ 具有指向成员的指针,因此无需自定义指针黑客即可完成这项工作。
  • @eerorika 你是对的。以前我有两个字符串作为成员,但我将它们更改为 int's。我忘了删除“std::”。

标签: c++


【解决方案1】:

是的,您可以使用指向成员的指针。类型的语法是TypeOfMember TypeOfStruct::*,要访问你做struct_variable.*pointer_variable

using StructMember = int DataSet::*;  // Pointer to a member of `DataSet` of type `int`

void foo(StructMember dsm) {
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.*dsm * ds.*dsm << std::endl;
}

int main() {
    foo(&DataSet::x);
    foo(&DataSet::y);
}

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多