Сообщение Re[4]: адрес метода у объекта от 19.04.2017 19:53
Изменено 19.04.2017 20:31 Erop
Re[4]: адрес метода у объекта
Здравствуйте, niXman, Вы писали:
X>да, ручная реализация, но только в плане вызова. мне же нужно больше...
Ты бы рассказал, чего тебе надо, может кто чего и предложит дельного...
Вот, например, можно написать такой макрос
С другой стороны, можно трактовать метод m класса c, как функцию, первый параметр которой с&
Не понятно что удобнее.
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>да, ручная реализация, но только в плане вызова. мне же нужно больше...
Ты бы рассказал, чего тебе надо, может кто чего и предложит дельного...
Вот, например, можно написать такой макрос
С другой стороны, можно трактовать метод m класса c, как функцию, первый параметр которой с&
Не понятно что удобнее.
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>
Не понятно что удобнее.