基于字符串访问类成员

时间:2015-03-08 18:49:36

标签: c++

我想写一个函数,它接受一个对象的向量和一个属性的名称。然后它会根据对象的属性值进行一些操作。最后会返回一个对象。

例如

class A{
         Point center;
         int length;
         ...
         ...
       };

class B{
         Point position;
         bool value;
         ... 
         ...
       }; 

现在如果我们将函数传递给A类型的向量,它应该根据center的值来操作对象;如果我们将函数传递给B类型的向量,它应该根据位置值来操作对象。

functiona(vector<T>,string property)

在函数内部如何根据传递的字符串属性访问属性?

编辑:第二个属性是字符串只是为了说明;我不在乎它是什么类型

1 个答案:

答案 0 :(得分:1)

是的,可以使用指向成员的指针来完成。使用示例:

#include <iostream>
#include <vector>

using namespace std;

class A {
public:
    int a;
    A(int x):a(x){}
};

class B {
public:
    int b;
    B(int x):b(x){}
};

template <typename T> int func(vector<T> data, int T::*pointer) {
    int total = 0;
    for (unsigned i = 0; i < data.size(); ++i) {
        total += data[i].*pointer;
    }
    return total;
}

int main() {
    vector<A> vec1;
    vec1.push_back(A(123));
    vec1.push_back(A(456));
    vec1.push_back(A(789));

    vector<B> vec2;
    vec2.push_back(B(666));
    vec2.push_back(B(666));
    vec2.push_back(B(666));

    cout << func(vec1, &A::a) << endl;
    cout << func(vec2, &B::b) << endl;

    return 0;
}

您声明指向成员的指针:valueType class::*pointerName,读取地址:&class::field并使用它们:object.*pointerToMemberpointerToObject->*pointerToMember