адрес метода у объекта
От: niXman Ниоткуда https://github.com/niXman
Дата: 18.04.17 13:16
Оценка:
сабж, как обычно, странный...

дано:
struct type {
   void m0() {}
   void m1(int) {}
};

template<T, typename ...Types>
void exec(T v, Types &&... args) {
   v(args...);
}

int main() {
   type t;
   exec(t.m0);
   exec(t.m1, 33);
}

суть: хочу передать в функцию exec() что-то одно, чтоб получить тип + сигнатуру + адрес объекта + адрес метода

т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 18.04.2017 13:17 niXman . Предыдущая версия .
Re: адрес метода у объекта
От: uzhas Ниоткуда  
Дата: 18.04.17 13:22
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>суть: хочу передать в функцию exec() что-то одно, чтоб получить тип + сигнатуру + адрес объекта + адрес метода


X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?


X>спасибо.


надо передать callable штуку. родные сишные указатели на методы таковыми не являются
ты можешь передать лямбду/std::function или bind, либо все же возиться с родными указателями, а их можно вызывать только когда есть и указатель на метод и указатель на объект
Отредактировано 18.04.2017 13:23 uzhas . Предыдущая версия .
Re: адрес метода у объекта
От: night beast СССР  
Дата: 18.04.17 13:28
Оценка: :))) :)
Здравствуйте, niXman, Вы писали:

X>сабж, как обычно, странный...


X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?


X>спасибо.


#define EXEC(FN,...) (FN)(__VA_ARGS__)
Re: адрес метода у объекта
От: _NN_ www.nemerleweb.com
Дата: 18.04.17 13:48
Оценка:
Здравствуйте, niXman, Вы писали:

X>сабж, как обычно, странный...

Действительно зачем может понадобиться так писать вместо прямого вызова функции ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: адрес метода у объекта
От: kov_serg Россия  
Дата: 18.04.17 14:09
Оценка:
Здравствуйте, niXman, Вы писали:

X>сабж, как обычно, странный...


X>дано:

X>
X>struct type {
X>   void m0() {}
X>   void m1(int) {}
X>};

X>template<typename T, typename ...Types>
X>void exec(T v, Types &&... args) {
X>   v(args...);
X>}

X>int main() {
X>   type t;
X>   exec(t.m0);
X>   exec(t.m1, 33);
X>}
X>

X>суть: хочу передать в функцию exec() что-то одно, чтоб получить тип + сигнатуру + адрес объекта + адрес метода

X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?


Так?
template<class T,void (T::*fn)(int)> struct mptr {
    T *t; mptr(T *t) : t(t) {}
    void operator ()(int x) { (t->*fn)(x); }
};
...
mptr<type,&type::m1> t_m1(&t);
exec(t_m1,33);
Re: адрес метода у объекта
От: rg45 СССР  
Дата: 18.04.17 14:10
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?


Двух параметров не достаточно, в данном случае — их должно быть три — объект, метод и фактический параметр. Можно свести к такому:
exec(&type::m1, t, 33);

Но я бы юзал bind или лямбды и не парился.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: адрес метода у объекта
От: night beast СССР  
Дата: 18.04.17 14:31
Оценка: +1
Здравствуйте, night beast, Вы писали:

X>>сабж, как обычно, странный...


X>>т.е. что я должен сделать, чтоб использовать вызов типа exec(t.m1, 33); и при этом проиходил вызов t.m1(33);?


X>>спасибо.


NB>
NB>#define EXEC(FN,...) (FN)(__VA_ARGS__)
NB>


чо ржете, я серьезно
макрос же может не только непосредственно функцию вызывать, но и делать лямбду, которая будет переадресовывать вызов.
Re[3]: адрес метода у объекта
От: uzhas Ниоткуда  
Дата: 18.04.17 14:44
Оценка: :)
Здравствуйте, night beast, Вы писали:

NB>чо ржете, я серьезно


ща Кодт придет про трамплины вещать
Re: адрес метода у объекта
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.04.17 07:16
Оценка:
все это нужно потому, что внутри exec() мне нужно получить тип класса и сигнатуру метода, для использования в метакоде.
помимо этого, мне нужен адрес объеката и метода, чтоб произвести вызов метода с передачей аргументов.

вобщем, насколько я понял — самый просто варианта это: exec(t, &type::m1, 33);

ок, вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 19.04.2017 7:16 niXman . Предыдущая версия .
Re[2]: адрес метода у объекта
От: _NN_ www.nemerleweb.com
Дата: 19.04.17 07:28
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>вобщем, насколько я понял — самый просто варианта это: exec(t, &type::m1, 33);

Т.е. ручная реализация std::bind и std::invoke ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: адрес метода у объекта
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.04.17 07:35
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Т.е. ручная реализация std::bind и std::invoke ?

да, ручная реализация, но только в плане вызова. мне же нужно больше...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: адрес метода у объекта
От: Erop Россия  
Дата: 19.04.17 19:53
Оценка:
Здравствуйте, 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>

Не понятно что удобнее.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Отредактировано 19.04.2017 20:31 Erop . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.