2015-03-08 78 views
1

我想编写一个函数,它接受一个对象的矢量和其属性之一的名称。那么它会根据对象的属性值做一些操作。最终会返回一个对象。基于字符串访问类成员

例如。

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

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

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

functiona(vector<T>,string property) 

里面的函数我怎样才能访问基于传递的字符串属性?

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

+0

这在C++中是不可能的。 – emlai 2015-03-08 18:51:32

+0

怎么样?有指向成员的指针,你可以将它们作为参数传递。 – Fireho 2015-03-08 18:56:24

+0

你可以用指向成员的方法做到这一点,但是如果你坚持把'property'作为一个字符串参数,那么不能这样做。 – 2015-03-08 18:59:23

回答

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