Здравствуйте, niXman, Вы писали:
X>суть: хочу передать в функцию exec() что-то одно, чтоб получить тип + сигнатуру + адрес объекта + адрес метода
X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?
X>спасибо.
надо передать callable штуку. родные сишные указатели на методы таковыми не являются
ты можешь передать лямбду/std::function или bind, либо все же возиться с родными указателями, а их можно вызывать только когда есть и указатель на метод и указатель на объект
Здравствуйте, niXman, Вы писали:
X>сабж, как обычно, странный...
X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?
X>спасибо.
X>суть: хочу передать в функцию exec() что-то одно, чтоб получить тип + сигнатуру + адрес объекта + адрес метода
X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?
Здравствуйте, night beast, Вы писали:
X>>сабж, как обычно, странный...
X>>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?
X>>спасибо.
NB>
NB>#define EXEC(FN,...) (FN)(__VA_ARGS__)
NB>
чо ржете, я серьезно
макрос же может не только непосредственно функцию вызывать, но и делать лямбду, которая будет переадресовывать вызов.
все это нужно потому, что внутри exec() мне нужно получить тип класса и сигнатуру метода, для использования в метакоде.
помимо этого, мне нужен адрес объеката и метода, чтоб произвести вызов метода с передачей аргументов.
вобщем, насколько я понял — самый просто варианта это: exec(t, &type::m1, 33);
ок, вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>вобщем, насколько я понял — самый просто варианта это: exec(t, &type::m1, 33);
Т.е. ручная реализация std::bind и std::invoke ?
Здравствуйте, _NN_, Вы писали:
_NN>Т.е. ручная реализация std::bind и std::invoke ?
да, ручная реализация, но только в плане вызова. мне же нужно больше...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, 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>
Не понятно что удобнее.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском