LINUX.ORG.RU

В старом С++ работал указатель только на обычные функции, а функции - члены класса нельзя было присваивать.

белены объелся? Можно и на методы, в.т.ч и на статические.

И без всякого c++11.

Также в C++ всегда можно перегружать operator()()

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

Вот что получилось:

#include <functional>
#include <iostream>

class Button
{
public:
	void MouseClick() { std::cout << «MouseClick!» << std::endl; }
};

int main()
{
	Button button;
	std::function< void() > onMouseClick;

	// bind
	onMouseClick = std::bind(&Button::MouseClick, button);
	onMouseClick();

	// lambda
	onMouseClick = [&]{ button.MouseClick(); }; 
	onMouseClick();

}

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

и зачем это всё?

не нагуглить тебе что-ли про указатели на методы класса? Помочь?

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

Указатели на нестатические методы — это жуткое говномесиво, которое лучше не тыкать даже трёхметровой палкой

Gvidon ★★★★ ()

а функции - члены класса нельзя было присваивать

#include <iostream>
using namespace std;

class Foo {
public:
	void foo() { cout  << "Foo::foo()" << endl; }
	static void static_foo() { cout  << "Foo::static_foo()" << endl; }
};

int main()
{
    typedef void (Foo::*callback)();
    typedef void (*static_callback)();
    
    Foo f;
    
    
    static_callback cb1= &Foo::static_foo;
    callback cb2 = &Foo::foo;
    
    
    cb1();
    (f.*cb2)();
    
}
twentypercentcooler ()
Ответ на: комментарий от Gvidon

Указатели на нестатические методы — это жуткое говномесиво, которое лучше не тыкать даже трёхметровой палкой

в следующий раз можешь сократить фразу: «я ниосилил».

emulek ()

а функции - члены класса нельзя было присваивать.

Если очень вежливо попросить, то можно.

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

Можно и на методы

в спп всё можно. только

в C++

так будет делать только такой как ты дебил.

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

чистить добро вилкой не удобно

да ты просто не осилил

fmdw ()

функции - члены класса нельзя было присваивать

Всегда можно было, google://pointer to member function Но да, в c++11 есть гораздо более удобные средства.

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

так будет делать только такой как ты дебил.

мне-то зачем? ТС просил зачем-то. Если уж ему надо указатель на функцию, это всяко лучше лямбды.

Конечно может и лямбда лучше, но нам-то откуда знать, что надо ТСу?

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

Проходил мимо...

Если уж ему надо указатель на функцию, это всяко лучше лямбды

и

Конечно может и лямбда лучше

Навеяло вопрос, откуда такие утверждения...Аргументируйте свои утверждения, хотелось бы знать что и когда лучше использовать... Хорошо бы еще и с std::function сравнить... з.ы. Это не стеб, просто действительно интересны случаю использования одних и других...

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

Навеяло вопрос, откуда такие утверждения...Аргументируйте свои утверждения, хотелось бы знать что и когда лучше использовать... Хорошо бы еще и с std::function сравнить... з.ы. Это не стеб, просто действительно интересны случаю использования одних и других...

ты про гайдлайны слышал? Если в проекте все используют лямбды, то и ты используешь. Всё просто.

На мой взгляд, единственный недостаток обычных указателей — множество говнокодеров, которые вообще не понимают, что это такое и как оно работает.

Как доказывает первый пост, иные даже считают, что «указателей на методы не бывает». А остальные считают, что «это очень сложно и непонятно».

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

Если есть возможность обойтись без raw pointers в любом виде, будь то указатель на функцию член или указатель на объект, - то нужно без них обходиться.
И это не догма, это просто рекомендация из best practices.

anonymous ()
Ответ на: комментарий от emulek

Нужен графический интерфейс пользователя для игры на OpenGL. Самое простое - накидиваешь свои кнопочки и привязываешь их событиям OnClick обработчики событий... Статические методы не подойдут...

sitev_ru ()
Ответ на: комментарий от emulek

«Как доказывает первый пост, иные даже считают, что указателей на методы не бывает»

статические методы - это считай теже функции - нельзя обращаться к свойствам класса

sitev_ru ()
Ответ на: комментарий от anonymous

Если есть возможность обойтись без raw pointers в любом виде, будь то указатель на функцию член или указатель на объект, - то нужно без них обходиться.

безусловно так. Лучше писать на высоком уровне, а не обмазываться указателями. Но сила C++ в том и заключается, что есть там разные уровни. Это не пхп, в котором необходимо жрать то, что дают.

Если уж ТС задаёт такие вопросы, то видимо стандартных callback'ов из Qt&gtkmm ему мало/не_нужно.

emulek ()
Ответ на: комментарий от sitev_ru

Нужен графический интерфейс пользователя для игры на OpenGL. Самое простое - накидиваешь свои кнопочки и привязываешь их событиям OnClick обработчики событий... Статические методы не подойдут...

посмотри как это сделано в Qt&gtkmm.

emulek ()
Ответ на: комментарий от sitev_ru

статические методы - это считай теже функции - нельзя обращаться к свойствам класса

не статические тоже можно, только помни о необходимости передачи this.

emulek ()
Ответ на: комментарий от anonymous

Просто у меня в проекте сделано так: Прилетает json, там есть параметр command = «init», command = «update» ... я у себя в карту залил ключом название метода а значением указатель на метод класса, а потом, когда команда прилетает, у меня никаких if нету, просто дергается метод и карты по названию команды... Вот я и спросил практику других юзеров...

energyclab ()
Ответ на: комментарий от emulek

В gtkmm использовали libsigc++, а городить свой moc как в Qt - ужасно.

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

ещё есть виртуальные функции, их тоже можно использовать как callback.

И, ИМХО, нужно. Что-бы указателями не обмазываться.

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

Не знаю кто что считает, а можешь мне привести такой указатель, которому можно было присваивать как указатель на метод, так и указатель на статическую функцию, или функтор какой нибудь. Потому что, с function+bind это делается очень легко и не принужденно. :)

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

а городить свой moc как в Qt - ужасно.

connect( button, &QPushButton::clicked, this, &MyClass::OnClicked );

и никакого moc

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

connect( button, &QPushButton::clicked, this, &MyClass::OnClicked );

и чо? давай еще собери без moc'а этот свой коннект и вызови

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

и чо? давай еще собери без moc'а этот свой коннект и вызови

Именно так и делаю.

anonymous ()
Ответ на: комментарий от emulek

в следующий раз можешь сократить фразу: «я ниосилил».

Превозмогание -> ЧСВ - это у тебя пройдет. std::function с лямбдами удобнее и все. Не надо ничего осиливать, чтоб шнурки на ботинках завязать без героического выражения морды лица и после этого еще сохранить способность ходить.

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

ЧСВ

вряд-ли. Просто ты не понимаешь, как эти лямбды работают. Я, честно говоря, тоже не совсем понимаю. А вот как работают указатели — я знаю. А ты — нет. Потому-то я на тебя и смотрю как на говно, потому-что ты даже знать этого не желаешь.

Извини, невежа.

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

Я, честно говоря, тоже не совсем понимаю

А что там понимать - обычный функтор, который за тебя генерирует компилятор.

(другой анонимус)

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

А что там понимать - обычный функтор, который за тебя генерирует компилятор.

в принципе да, но я не совсем понимаю, какой код из всего этого получится на моих архитектурах. Не, вещь годная и нужная, но если не понимаешь, как оно работает, получается говнокод ИМХО.

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

Я, честно говоря, тоже не совсем понимаю.

И при этом срёшь в каждый тред по спп. Эпичненько.

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

И при этом срёшь в каждый тред по спп. Эпичненько.

лямбды совсем недавно накостылили в C++. И как они себя будут вести в реальных проектах — не знает никто.

emulek ()
Последнее исправление: emulek (всего исправлений: 1)
Ответ на: комментарий от emulek

Так что чудо решения на указателях можно не ждать? :)

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

Извини, невежа.

Ты и как русский язык работает не понимаешь. «Невеж(д)а» - буковку, поди, пропустил? («Невежа» - это кто с тобой невежлив. А кто чего-то по-твоему не знает - невежда. Хотя ты не знал, да? Вывел от «невежество», а еще чего-то блеешь про указатели).

П.С. Можно понимать, как работают указатели, но лениться самому писать функторы - если можно короче то же самое записать лямбдами. Но тебе просто нравится превозмогать, не знать лямбды - и гордиться невежествомпревозмоганием/

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

«Невежа» - это кто с тобой невежлив.

я в курсе.

если можно короче то же самое записать лямбдами.

я не думаю, что это «тоже самое».

Но тебе просто нравится превозмогать

алсо, это никак не коррелирует с моим ЧСВ.

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

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

это твоя абстрактная хотелка. Я не очень понимаю, зачем тебе это нужно IRL.

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

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

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

Укурился? Им уже лет 5. Они превращаются в хорошо изученные функциональные объекты. Что там не очевидного?

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

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

почему нельзя использовать указатель на базовый класс, а callback реализовать в наследнике(в базовом это будет чистой виртуальной функцией)?

Чем это не подходит например для кнопочек и методов OnClick() ?

emulek ()
Ответ на: комментарий от Gorthauer

Укурился? Им уже лет 5.

я пишу на C++ несколько дольше.

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

Например тем, что для обработки принеприменно нужен какой то объект. Я не могу указать лямбду или обычную функцию.

BRE ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.