1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| bool parseParam(istream &str, int &value);
bool parseParam(istream &str, short &value);
bool parseParam(istream &str, string &value);
bool parseParam(istream &str, int* &value);
//etc.
class FunctionCall
{
virtual string Invoke(void *obj, string param);
};
template< class Obj, class Ret, class A, class B, class C >
class TFunctionCall3
{
typedef Ret (Obj::*func_type)(A, B, C);
TFunctionCall3(func_type f);
virtual string Invoke(void *obj, string param);
func_type m_f;
};
template< class Obj, class Ret, class A, class B, class C >
string TFunctionCall3::Invoke(void *obj, string param)
{
Obj *pObj = static_cast< Obj * >(obj);
A a;
B b;
C c;
istringstream iss(param);
if(!parseParam(iss, a)) throw exception("invalid parameter");
if(!parseParam(iss, b)) throw exception("invalid parameter");
if(!parseParam(iss, c)) throw exception("invalid parameter");
Ret ret = (pObj->*m_f)(a, b, c);
return to_string(ret);
};
+ TFunctionCall0, TFunctionCall1, TFunctionCall2, TFunctionCall3, etc. |
Partager