2012-05-19 3 views
0

Мне нужен переключатель для различных функций, чтобы обойти частые if-направления. Он должен работать аналогичен следующий код, инкапсулированный в классе:функция указатель внутри класса

#include<iostream> 
#include<stdlib.h> 

using namespace std; 

template<class T> 
class MaxSwitch 
{ 
public: 
typedef T (MaxSwitch::*Max_P)(T,T); 
Max_P fooC_P; 

MaxSwitch(int Q) { 
    if (Q==0)fooC_P=&MaxSwitch::MaxVal1; 
    else fooC_P=&MaxSwitch::MaxVal2; 
} 

inline T MaxVal1(T kx,T MAX) 
{ 
    return kx+1; 
} 

inline T MaxVal2(T kx,T MAX) 
{ 
    return MAX; 
} 

}; 

int main(int argc, char ** argv) 
{ 
int Q=atoi (argv[1]); 
MaxSwitch<int> MAXSW(Q); 


int MAX=5; 

for (int kx=0;kx<MAX;kx++) for (int ky=0;ky<(MAXSW.fooC_P)(kx,MAX);ky++) 
    { 
     cout<<"(kx="<<kx<<", ky="<<ky<<endl; 
    } 

return 0; 
} 

я сейчас тривиальную проблема, что вызов функции (MAXSW.fooC_P) (KY, MAX) является неправильным. Как это сделать правильно?

+0

быстрое примечание: ваше соглашение об именах параметров делает код не то, что читаемый .. –

+0

(Jay D в настоящее время хорошо с «не то, что для чтения» - я бы сказал совершенно путают.) – Mat

+0

, вы можете его отредактировать! –

ответ

6

MAXSW.fooC_P - это функция-указатель-член, которую необходимо вызвать, и MAXSW - это объект, на который вы хотите позвонить. Таким образом, вы можете вызвать эту функцию с помощью:

(MAXSW.*(MAXSW.fooC_P))(ky,MAX); 
+0

Обратите внимание, что '(MAXSW. * MAXSW.fooC_P) (ky, MAX)' также будет работать (то есть - внутренние скобки являются избыточными). – Mankarse

Смежные вопросы