2014-10-20 47 views
1

我有,其計算基於輸入參數的結構體的函數。 是否可以通過傳遞所需的變量作爲參數來編寫一個只返回計算結構的某個變量的函數? 問題是結構必須在函數內部創建和計算,所以我只知道結構成員的將來變量名稱。C++通行證結構成員作爲參數

基本上我要的是替換下列硬編碼 - 由我作爲參數傳遞給主「DoSomethingSpecific」功能的可變部分「> member1上」。

double DoSomethingSpecific() 
{ 
    struct *s = CalculateStruct(); 
    DoSomethingElse(s->member1); 
} 

編輯: 我創建了一個基於現在的工作,解決了通過結構成員作爲變量,而無需創建結構itsself運作的實質性問題的答案小例子。然而,數據類型(INT)必須​​在這種情況下,之前已知的(否則,如果需要的模板,將有助於)

#include <iostream> 
using namespace std; 

struct MyStruct 
{ 
    int a; 
    int b; 
}; 

int GetVariable(int MyStruct::* field) 
{ 
    MyStruct *_myStruct = new MyStruct(); 
    _myStruct ->a = 1; 
    _myStruct ->b = 2; 

    return _myStruct->*field; 
} 

int main() 
{ 
    int my_variable = GetVariable(&MyStruct::a); 
    return 0; 
} 
+0

你可以有一個指向成員的指針。似乎略顯粗略,但。 – chris 2014-10-20 11:54:34

+0

如果我的結構在函數調用之前不存在,我該如何獲得指向成員的指針? – bergmeister 2014-10-20 11:56:51

+0

結構或結構本身的實例?你不需要一個實例來指向成員。 – chris 2014-10-20 11:58:31

回答

4

你可以在一個指針到數據成員傳遞:

double DoSomethingSpecific(double Struct::* field) 
{ 
    Struct *s = CalculateStruct(); 
    DoSomethingElse(s->*field); 
} 

然後調用它:

DoSomethingSpecific(&Struct::member1); 

編輯,根據您編輯的問題修復:

int GetVariable(int MyStruct::* field) 
{ 
    MyStruct *_myStruct = new MyStruct(); 
    _myStruct->a = 1; 
    _myStruct->b = 2; 

    return _myStruct->*field; 
} 
+0

現在,先生,是句法 - 地獄:D,但我想它的工作原理 – Creris 2014-10-20 12:14:03

+0

@Creris:如果你認爲指向數據成員的指針是討厭的,那麼你一直沒有使用C++很長時間。 ;-) – 2014-10-20 12:16:00

+0

以及我見過很多,但我從來沒有看到 - > *或。*的任何實際用途,所以它有點令人驚訝。 SFNIAE總體上差得多 – Creris 2014-10-20 12:17:17

0

如果你知道它的類型,你可以傳遞一個指針。在構建Struct時,使用指針初始化成員。