2014-03-12 36 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);