2014-03-12 69 views
0

我有兩個具有許多函數的類(函數不能是'靜態')。 我想通過模板函數每次調用另一個函數。 我試圖編寫模板函數,但我不知道如何使用我想要的類函數調用模板函數。 我附加了一個簡單的代碼的問題:通過模板函數調用類函數

class FirstClass 
{ 
public: 
    FirstClass() 
    { 
     int y = 7; 
     y++; 
    } 
    void FirstFunction(int x) 
    { 
     x++; 
    } 
}; 

class SecondClass 
{ 
public: 
    SecondClass() 
    { 
     int y = 7; 
     y++; 
    } 
    void SecondFunction(int y) 
    { 
     y--; 
    } 
    void ThirdFunction(int y) 
    { 
     y--; 
    } 
}; 

template<class OBJECT, void (*FUNCTION)> 
void Test(int x) 
{ 
    OBJECT *a = new OBJECT(); 
    a->FUNCTION(); 
    delete a; 
} 

void main() 
{ 
    Test<FirstClass, &FirstClass.FirstFunction>(5); 
    Test<SecondClass, &SecondClass.SecondFunction>(5); 
    Test<SecondClass, &SecondClass.ThirdFunction>(5); 
} 

謝謝...

+0

您的意思是x'傳遞參數'的成員函數調用時?你的代碼只有'FUNCTION()' – Brian

回答

3

A C++編譯器是在演繹類型特別好。爲了不直接指定要調用的成員函數的類型,爲什麼不讓編譯器爲您做這件事呢?

template <typename T> 
void Test(void (T::*f)(int), int x) 
{ 
    auto a = new T; 
    (a->*f)(x); 
    delete a; 
} 

注意奇怪的T::*語法。它說f是一個指向成員函數的指針,它返回void並採用int。類fT的成員,將由編譯器推導出來。要真正調用該函數,您需要使用(甚至是更大的)->*語法。請注意,由於必須通過對象調用成員函數,因此您需要創建一個T

雖然它不必動態分配。你可以和採寫:

template <typename T> 
void Test(void (T::*f)(int), int x) 
{ 
    T a; 
    (a.*f)(x); 
} 

你調用函數Test這樣的:

Test(&FirstClass::FirstFunction, 42);