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);
        }
    } ;