我试图将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;
};
那样:
答案 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;
}
答案 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%;}