LINUX.ORG.RU

Передать указатель на метод объекта в функцию

 , ,


0

1

Здравствуйте! Мне нужно передать указатель на метод объекта в функцию. Нужно чтобы можно было из любого класса, с любым типом и аргументами. Как это сделать?

Как-то так?

template <class C> class zero{

};
template <typename T>

button(int nx, int ny, int nw, int nh, T C::*nc());

Заранее спасибо!

предыдущий коммент или гугли fastdelegate

gavlig ★★★ ()
Ответ на: комментарий от yoghurt

слегка офтоп, но интересный факт - std::bind в 11ом, уже как бы пережиток, и рекомендуют использовать lambda.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

Кто рекомендует?

Включение bind из буста в std и введение лямбд произошли одновременно с приходом 11x, как же так получилось, что одна новая фича задепрекейтила другую новую фичу? По мне же так бинд местами удобнее.

yoghurt ★★★★★ ()

Вместо метода, передай туда указатель на объект, пусть сами объекты, если у них различные реакции на одно «событие»(?), имеют свои собственные реализации метода.

А если в будущем может понадобиться еще парочку методов дернуть в том же месте, а в другой ф-ции не все три подряд, а только первый и третий? А какие-то внутренние состояния объектов тоже передавать?

Вот чтобы не велосипедить потом с аргументами, я бы передал сразу весь объект.

deep-purple ★★★★★ ()

Может вам подойдут signal/slot?

andreyu ★★★★★ ()
Ответ на: комментарий от yoghurt

Включение bind из буста в std и введение лямбд произошли одновременно с приходом 11x, как же так получилось, что одна новая фича задепрекейтила другую новую фичу?

Некоторые финты можно делать bind'ом, но нельзя лямбдами. Например, передавать move-only объекты как параметры. Этот момент пофиксили в 14 и теперь bind нужен ещё меньше. Навскидку даже и не помню других киллер-фич bind'а. Так-то пусть будет, при определённом везении с ним код выглядит проще и понятнее, чем с лямбдой.

const86 ★★★★★ ()
Ответ на: комментарий от BRE

yoghurt, ну это как минимум маерс в своём новом эффективном рекомендует, и ещё n-ое количество людей с ним согласно.

По мне же так бинд местами удобнее

Не срача ради, но можно кейс?

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

маерс в своём новом эффективном

Ого, новый эффективный вышел? Надо почитать, спасибо

Не срача ради, но можно кейс?

Да просто удобнее для зрительного восприятия.

#include <functional>
#include <iostream>

struct Obj {
   int foo(int a, int b, int c) { return a+b+c; }
   int bar()                    { return 42;    }
};

int main (int argc, char *argv[]) {
   using namespace std::placeholders;
   Obj obj;
   
   auto f1 = [&obj](int a) { return obj.foo(a, 2, 3); };
   auto f2 = std::bind(&Obj::foo, &obj, _1, 2, 3);

   std::cout << f1(1) << ", " << f2(1) << std::endl;

   auto b1 = [&obj]() { return obj.bar(); };
   auto b2 = std::bind(&Obj::bar, &obj);

   std::cout << b1() << ", " << b2() << std::endl;
   
   return 0;
}

Про более тонкие материи уже выше написали.

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

Ну это уже больше дело привычки и вкуса :) Вот про

Например, передавать move-only объекты как параметры.

надо будет посмотреть.

Просто кайф лямбд, что можно простую преобработку параметров запросто поместу вставлять. Визуально у бинда буков меньше, но семантически оно выглядит понятней.

Ого, новый эффективный вышел? Надо почитать, спасибо

Ну да, но покупать не советую, денег своих книженция не стоит(по крайней мере с текущим курсом). Особенно мутная глава про pimpl. Но пару интересных моментов можно почерпнуть, особенно если на ворке 11ый не используешь активно.

pon4ik ★★★★★ ()
Последнее исправление: pon4ik (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.