2013-11-26 214 views
1

我試圖將一個類的成員作爲參數傳遞給一個函數(不是成員方法)。我的意圖的簡單例子就是這樣。傳遞成員名稱作爲參數

template <typename ObjType> 
void myOutput(ObjType* obj, ????) 
{ 
    std::cout << obj->???? << std::endl; 
} 

struct A 
{ 
    int a; 
}; 

struct B 
{ 
    std::string b; 
}; 

int main() 
{ 
    A A1; 
    B B1; 
    A1.a = 1; 
    B1.b = "something"; 

    myOutput(&A1, A1::a); 
    myOutput(&B1, B1::b); 

    return 0; 
} 

所以我的問題是我應該怎樣取代「????」用?我沒有使用C++ 11。

謝謝。

編輯:

爲了澄清我的意圖。函數myOutput並不真正知道我的成員的名字,我不想使用像memberToString()之類的函數。

所以輸出應該看起來像這樣的第一個電話。

void myOutput(A* obj, ????) 
{ 
    std::cout << obj->a << std::endl; 
} 

和第二

void myOutput(B* obj, ????) 
{ 
    std::cout << obj->b << std::endl; 
} 
+2

如果你正在傳遞對象,爲什麼你還想傳遞一個成員變量?您可以使用提供的對象直接訪問它們。 –

+0

爲什麼你傳遞兩個參數?你到底想做什麼?你不能直接從main()直接調用一個獨立的方法,直到它是static.Please檢查 – manish

+0

爲什麼你不只是添加一個參數到你的func,如模板 Nik

回答

4

如果你知道在編譯時的成員名稱,你可以使用一個成員指針指到成員。當然

myOutput(&A1, &A::a); 
myOutput(&B1, &B::b); 

,你應該問自己,爲什麼是你想這樣做,如果它不可能簡單地通過A1->a或:

template <typename ObjType, typename MembType> 
void myOutput(ObjType* obj, MembType memb) 
{ 
    std::cout << obj->*memb << std::endl; 
} 

這可以被稱爲例如相反,B1->b直接作爲單個參數加入到函數中。

+0

應該是&&:: a'和&B :: b'。 – jrok

+0

@jrok謝謝,修正。 – Agentlien

+0

謝謝,解決了它! –

相關問題