Информация об изменениях

Сообщение Re[4]: адрес метода у объекта от 19.04.2017 19:53

Изменено 19.04.2017 20:31 Erop

Re[4]: адрес метода у объекта
Здравствуйте, niXman, Вы писали:

X>да, ручная реализация, но только в плане вызова. мне же нужно больше...


Ты бы рассказал, чего тебе надо, может кто чего и предложит дельного...

Вот, например, можно написать такой макрос
template<typename T, T t> class my_very_smart_proxy;
template<typename TObj, typename TRes, typename... TArgs, TRes TObj::*t(TArgs...)>
class my_very_smart_proxy<TRes TObj::*(TArgs...), t> {
    TObj* obj;
public:
    my_very_smart_proxy( TObj& o ) : obj( &o );
    TRes operator()(TArgs... args) const { return o->*t(args...); }
    static TRes CStyleCall( TObj* pO, TArgs... args ) { return pO->*t(args...); }
};

#define MEMBER_PTR( OBJECT, MEMBER ) my_very_smart_proxy<    decltype(&decltype(OBJECT)::MEMBER),     &decltype(OBJECT)::MEMBER >( OBJECT )


С другой стороны, можно трактовать метод m класса c, как функцию, первый параметр которой с&
Не понятно что удобнее.
Re[4]: адрес метода у объекта
Здравствуйте, niXman, Вы писали:

X>да, ручная реализация, но только в плане вызова. мне же нужно больше...


Ты бы рассказал, чего тебе надо, может кто чего и предложит дельного...

Вот, например, можно написать такой макрос
template<typename T, T t> class my_very_smart_proxy;
template<typename TObj, typename TRes, typename... TArgs, TRes (TObj::*t)(TArgs...)>
class my_very_smart_proxy<TRes (TObj::*)(TArgs...), t> {
    TObj* obj;
public:
    my_very_smart_proxy( TObj& o ) : obj( &o );
    TRes operator()(TArgs... args) const { return (o->*t)(args...); }
};

#define MEMBER_PTR( OBJECT, MEMBER ) my_very_smart_proxy<\
    decltype(&decltype(OBJECT)::MEMBER), \
    &decltype(OBJECT)::MEMBER \
>( OBJECT )


С другой стороны, можно трактовать метод m класса c, как функцию, первый параметр которой с&
template<typename T, T t> struct CStyleMethodProxy;
template<typename TObj, typename TRes, typename... TArgs, TRes (TObj::*pM)(TArgs...)> 
struct CStyleMethodProxy <TRes (TObj::*)(TArgs...), pM> {
    static TRes Call(TObj* o, TArgs... args) { return (o->*pM)(args...); }
};

#define C_STYLE_METHOD_PROXY( METHOD_PTR ) CStyleMethodProxy<decltype(METHOD_PTR), METHOD_PTR>

Не понятно что удобнее.