struct ISomeInterface
{
    virtual unsigned doSomething() = 0;
};

template<typename TInterface, typename TDerived>
class CImplBase : public TInterface
{
    public:

    typedef TDerived derived_class;
    typedef unsigned (typename derived_class :: *param_set_proc_t)( const std::wstring &paramName, void *pv ); //!!!
    typedef unsigned (typename derived_class :: *param_get_proc_t)( const std::wstring &paramName, void *pv );

    struct CParamHandlerInfo{
           typename param_set_proc_t  set_proc;
           typename param_get_proc_t  get_proc;
           CParamHandlerInfo( param_set_proc_t s, param_get_proc_t g ) : set_proc(s), get_proc(g) {}
    };

    std::map< std::wstring , CParamHandlerInfo > paramHandlers;

    void addParamHandler( const std::wstring &name, param_set_proc_t s, param_get_proc_t g )
    {
        paramHandlers[name] = CParamHandlerInfo(s,g);
    }

    typename std::map< std::wstring , CParamHandlerInfo >::const_iterator
    findParamHandler( const std::wstring &name )
    {
     return paramHandlers.find( name );
    }


    unsigned setParam(const std::wstring &paramName, void *pv )
       {
        std::map< std::wstring , CParamHandlerInfo >::const_iterator cit = findParamHandler( paramName );
        if (cit==paramHandlers.end())
           return 0;
        return this->*(cit->set_proc)(paramName,pv);
       }

    CLIMETHOD(getParam) (const std::wstring &paramName, void *pv )
       {
        std::map< std::wstring , CParamHandlerInfo >::const_iterator cit = findParamHandler( paramName );
        if (cit==paramHandlers.end())
           return 0;
        return this->*(cit->get_proc)(paramName,pv);
       }


};

// Использование
class CImpl : public CImplBase<ISomeInterface,CImpl>
{
    public:

    unsigned paramSetParamHandler( const std::wstring &paramName, void *pv )
       {
        return 0;
       }

    unsigned paramGetParamHandler( const std::wstring &paramName, void *pv )
       {
        return 0;
       }

    CImpl()
    {
     addParamHandler( L"param", &paramSetParamHandler, &paramGetParamHandler );
     //addParamHandler( L"param", &CImpl::paramSetParamHandler, &CImpl::paramGetParamHandler ); // или так?
    }

    unsigned doSomething()
    {
     return 0;
    }

};

int main()
{
    CImpl impl;
    impl.getParam(L"param", (void*)0 );
}

