Listing 2
class func_variant
{
public :
~func_variant() { delete data; }
func_variant(const func_variant& another ) :
data(another.data->copy_self()){}
// 1 - argument regular function
template<typename R,typename A0> func_variant ( R(*pFunc)(A0) ):
data( new Impl<R,A0>( pFunc ) ){}
// 1 - argument member function
template<typename R, typename C, typename A0>func_variant( R(C::*pFunc)(A0)):
data( new MemFuncImpl_1<R,C,A0>( pFunc ) ){}
// 1 - argument constant member function
template<typename R, typename C, typename A0>
func_variant( R(C::*pFunc)(A0) const ):
data( new ConstMemFuncImpl_1<R,C,A0>( pFunc ) ){}
private :
template<typename R,typename C, typename A0>
struct ConstMemFuncImpl_1 : ImplBase
{
typedef R(C::*P2FUNCT_TYPE)(A0) const;
ConstMemFuncImpl_1 ( P2FUNCT_TYPE v ) : data ( v ) {}
P2FUNCT_TYPE data;
vector<jobj_wrapper>* _p_args;
jobject invoke( JNIEnv *env, vector<jobj_wrapper>& jArrArgs )
{
if( jArrArgs.size() == 2 ){
_p_args = &jArrArgs;
return returnResult<R>();
}
throw invalid_argument ( ... ) ;
}
template<typename R> jobject returnResult(){
return return_jobj_from_native_type( java::_env,
(R) ( (((*_p_args)[0]).operator C*())->*data) // signature
( ((*_p_args)[1]).operator A0() ) );//call
}
template<> jobject returnResult<void>(){
(R) ( (((*_p_args)[0]).operator C*())->*data) // signature
( ((*_p_args)[1]).operator A0() );// void call, w/o return
return NULL;
}
ImplBase* copy_self(){
return new ConstMemFuncImpl_1(data);
}
} ;