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