是否可以将struct的成员变量作为参数传递

时间:2017-08-21 20:33:15

标签: c++

我试图将struct的成员变量与类相关联。因此,当我创建一个新类时,我可以指定它在结构中与此成员变量相关联。例如:

struct A {
  int a;
  int b;
};

static A a[2];
a[0].a = 1;
a[0].b = 2;
a[1].a = 3;
a[1].b = 4;

class foo {
 public:
  foo(int index, ???) {
    c = a[index].???;  //Is it possible to define the 2nd parameter as a getter of struct A's member? So this line could resolve to either a[index].a or a[index].b?
  }
 private:
  int c;
};

那样:

  • new foo(0,???)将c设置为1给出???参考A :: a
  • new foo(0,???)将c设置为2给出???参考A :: b
  • new foo(1,???)会将c设置为3给出???参考A :: a
  • new foo(1,???)将c设置为4给出???参考A :: b

3 个答案:

答案 0 :(得分:5)

是的,您可以传递数据成员指针:

#include <iostream>

struct A
{
    int a;
    int b;
};

static A a[2]
{
    1, 2
,   3, 4
};

class foo
{
    public: int c;

    public:
    foo(int const index, int A::* const p_field)
    {
        c = a[index].*p_field;
    }
};

int main()
{
    foo const f1(0, &A::a);
    ::std::cout << f1.c << ::std::endl;
    foo const f2(0, &A::b);
    ::std::cout << f2.c << ::std::endl;
    foo const f3(1, &A::a);
    ::std::cout << f3.c << ::std::endl;
    foo const f4(1, &A::b);
    ::std::cout << f4.c << ::std::endl;
    return 0;
}

Check this code at online compiler

答案 1 :(得分:2)

你有几个选择。如果您只想要整数(就像您在代码中发布的那样),那么只需将一个整数作为参数添加到构造函数中,并将其传递给正确的数字。

class foo {
 public:
  foo(int val) {
    c = val
  }
 private:
  int c;
};

int main() {
    foo f(a[0].b);
}

或者你可以引用一个整数。这样一来,如果一个人改变了,另一个也会改变:

class foo {
 public:
  foo(int &val) : c(val) { } //need to use an initialization list for this one
 private:
  int &c;
};

int main() {
    foo f(a[0].b);
    a[0].b = -1; //f.c will be -1 now as well
}

答案 2 :(得分:0)

在VTT的答案中使用数据成员指针是最直接的解决方案,但我经常发现成员指针和成员函数指针语法有点麻烦,我相信编译器很难进行优化。

对于这类事情,我更喜欢使用无状态lambda。您可以将lambda传递给函数模板,然后编译器可以轻松地将其优化:

 #header .container {
    width: 100%;}