Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача функции или метода в кач-ве параметра 
:(
    Опции темы
archimed7592
Дата 30.4.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Любитель @  30.4.2007,  23:23 Найти цитируемый пост)
Всё-таки позволю не согласиться...
с чем несогласен то?
насчёт прикола плюсов: это не прикол... это само совершенство... ;)

Добавлено через 57 секунд
Цитата(Любитель @  30.4.2007,  23:23 Найти цитируемый пост)
А програмерить на плюсах - приятно, блин! 
ага... люблю этот язык  smile 


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 30.4.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Не соглашусь, что на языках с нэтивной поддержкой ФП невозможно писать. Можно и очень хорошо. На некоторых даже интересно. Но плюсы - не знаю, лично мне всё-таки нравиться дизайн и философия языка. Недоделан он, конечно, но, блин, хорош...


--------------------
PM MAIL ICQ Skype   Вверх
Mayk
Дата 30.4.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Уж если буст тянуть, то можно черезboost'овые сигналы связь с SDL сделать.

Примерно так:
Код

#include <boost/signal.hpp>
#include <boost/bind.hpp>

using namespace std;
using namespace boost;



// это относится к SDL
typedef int* Key;
struct kbd_handler{
    static signal<void (Key)> key_pressed;
};

signal<void (Key)> kbd_handler::key_pressed;


// это уже нет
class MyClass
{
    public:
    void pressed_key( Key key_code ){
        printf("pressed %p\n", key_code );
    }
};


int main()
{
    MyClass kr;
    kbd_handler::key_pressed.connect( bind(&MyClass::pressed_key, &kr, _1)  );


    // это происходит в окресностях  SDL_PollEvent'а
    kbd_handler::key_pressed((Key)1);
}


Цитата

03:48:dvl:~/src/pol$ ./a.out 
pressed 0x1



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 1.5.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Любитель @  30.4.2007,  23:29 Найти цитируемый пост)
Не соглашусь, что на языках с нэтивной поддержкой ФП невозможно писать. Можно и очень хорошо. На некоторых даже интересно.
соддержкой - да... поддержка это хорошо... я про чистые ФЯП говорил... хаскел к примеру smile от лукавого, имхо...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Mayk
Дата 1.5.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(archimed7592 @  1.5.2007,  04:05 Найти цитируемый пост)
)
Не соглашусь, что на языках с нэтивной поддержкой ФП невозможно писать. Можно и очень хорошо. На некоторых даже интересно.
соддержкой - да... поддержка это хорошо... я про чистые ФЯП говорил... хаскел к примеру smile от лукавого, имхо... 

smile  Господа, к порядку. smile 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Любитель
Дата 1.5.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(archimed7592 @  1.5.2007,  00:05 Найти цитируемый пост)
от лукавого, имхо...

 smile 

Насчёт boost::signals - немного недоделана либа:
1. Хорошо бы иметь возможность паблик-доступа на коннект и прайват - на вызов. Или типа того.
2. Очень неприятно упоминание о потонебезопасности в доках по либе smile Впрочем, libsigc++ тоже вроде бы особым потокосейфити не обладает...


--------------------
PM MAIL ICQ Skype   Вверх
Mayk
Дата 1.5.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Любитель @  1.5.2007,  04:11 Найти цитируемый пост)

1. Хорошо бы иметь возможность паблик-доступа на коннект и прайват - на вызов. Или типа того.

набросочно это можно решить  так: 
Код

class private_signal : public signal<void (Key)>
{
    friend class kbd_handler; //kbd_handler наш друг
    private:
    using signal<void (Key)>::operator(); //вызов запрещён
};

struct kbd_handler{
    static private_signal key_pressed;

    static void emit(){
        key_pressed(0); //друзья вызывают private'но
    }
};

private_signal kbd_handler::key_pressed;

class MyClass
{
    public:
    void pressed_key( Key key_code ){
        printf("pressed %p\n", key_code );
    }
};
int main()
{
    MyClass kr;
    kbd_handler::key_pressed.connect( bind(&MyClass::pressed_key, &kr, _1)  );
    kbd_handler::emit(); 
//  kbd_handler::key_pressed(0); // Compile time error
}




Это сообщение отредактировал(а) Mayk - 1.5.2007, 00:27


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Ken
Дата 1.5.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: 2
Всего: 4



Цитата(nerezus @ 30.4.2007,  18:51)
2) То же самое, но с методом объекта, а не с функцией. Класс объекта заранее не известен.

Nerezus, почему не хотите использовать event listener-ы в стиле Java? Это проще и не требует темплейтов и доп. библиотек. Например, допустим, вы создаете компонент Button. Хотите от него получить событие onClick (). Просто объявляем новый абстрактный класс (interface):
Код

class Button;
class ButtonListener
{
    public:
        virtual void onClick (Button* sender) = 0; // sender, чтобы узнать от какого Button это событие, можете убрать
};

А к классу Button добавляем метод и член:
Код

class ButtonListener;
class Button
{
    public:
        Button ():
            _listener (NULL)
        {
        }
...
        void setListener (ButtonListener* listener)
        {
            _listener = listener;
        }
...
    private:
...
        ButtonListener* _listener;
};

Класс который хочет ловить событие onClick () должен наследовать от ButtonListener и реализовать метод onClick (). А внутри одного из методов Button генерация onClick будет выглядеть так:
Код

void Button::doClick ()
{
    if (_listener != NULL)
        _listener->onClick (this);
}

Регистрация обработчика уже будет выглядеть примерно как вы хотите:
Код

Button* closeButton = new Button ();
closeButton->setListener (closeButtonController);



Это сообщение отредактировал(а) Ken - 1.5.2007, 01:12
PM MAIL   Вверх
Любитель
Дата 1.5.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Mayk, ну я немного по другому делаю - у меня шаблон для сигналов (юзающий бустовские, конечно) с дополнительным параметром - классом, для которого разрешён вызов сигнала.

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


--------------------
PM MAIL ICQ Skype   Вверх
Ken
Дата 1.5.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: 2
Всего: 4



Цитата(Любитель @ 1.5.2007,  08:49)
Насчёт ивент-листенеров - в яве есть анонимные классы, в плюсах нет. Потому юзать ивент-листенеры наглой копией - не очень приятно. К тому же пропадает возможность биндинга и пр. приятных вещей.


Что означает "юзать ивент-листенеры наглой копией"?

Не обязательно использовать анонимных классов. Если количество объектов от которых можем получать событий не очень много, то один класс-контроллер отвечающий за логику приложения бывает достаточным, если много, то можно создавать разные контроллеры обрабатывающие события. Мне нравится простота и эффективность этой схемы, она работает без дополнительных затрат (зачем boost, особенно в встроенных системах только из за этого).

Это сообщение отредактировал(а) Ken - 1.5.2007, 09:18
PM MAIL   Вверх
nerezus
Дата 1.5.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

скажи для начала в каких языках есть такие же мощные средства для ФП
 Насчет "такие же" я не знаю, но вот в питоне ФП намного более развито. Пример:
Код

# -*- coding: windows-1251 -*-

# Использование лябмда-функций в языке Python.
# Практическое применение

import time

# Часть первая: объявление простой функции
mult = lambda x, y: x * y
print "mult(1, 3) =", mult(1, 3)


# Часть вторая: Объявление функции в зависимости от внешних параметров.
def inc(n): return lambda x: x + n
inc6 = inc(6)
print "inc6(5) =", inc6(5)


# Часть третья: объявление функции, основанной на другой лямбда-функции
square = lambda x: mult(x, x)
print "square(7) =", square(7)


# Часть четвертая: создаем массив функций.
print "mult_arr[i](5)"
mult_arr = [] # список(массив) функций
for i in range(0, 10):
    mult_arr.append(lambda x: x * i) # добавляем в список функцию
# Демонстрация массива функций    
for i in range(0, 10):
    print mult_arr[i](5)


# Часть пятая: обход всех значений списка:
list = [0, 1, 2,3, 6, 10, 100, 777]
# использование спискового включения
print [x*2 for x in list]

# Часть шестая: вычисление факториала
# reduce() - обход списка, range() - создание списка
# Для вычисления факториала используются 2 lambda-функции
fact = lambda n: reduce(lambda x, y: x * y, range(1, n+1), 1)
print "fact(6) =", fact(6)

# Часть седьмая: полином Ньютона
x1 = 0.3; x2 = 0.4; x3 = 0.6
y1 = -2;  y2 = 1.2; y3 = 7.3;
L0 = y1 / ((x1-x2) * (x1-x3))
L1 = y2 / ((x2-x1) * (x2-x3))
L2 = y3 / ((x3-x1) * (x3-x2))
# Создаем функцию, основываясь на входных значениях
newt = lambda x: L0*(x-x2)*(x-x3) + L1*(x-x1)*(x-x3) + L2*(x-x1)*(x-x2)
print "newt(0.5) =", newt(0.5)


time.sleep(300)



Цитата

Но красоты я лично не вижу. Не привлекает.
 А у меня к плюсам неприязнь. В стиле "зачем усложнять, если можно проще". Но это оффтоп, продолжать не надо )


Ken, оо, самый лучший совет )  Просто это со стороны структурного кода работать не будет, ну да ладно, ну первую часть нафиг. Спасибо.
В C++ можно же при наследовании от 2х классов тип указателя на Child сделать указателем на Parent1(лисенер)? Ну вот и лучший вариант )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Любитель
Дата 1.5.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(nerezus @  1.5.2007,  10:30 Найти цитируемый пост)
но вот в питоне ФП намного более развито.

В пиноте нэтив-роддержка. А в плюсах красивая эффектная реализация. smile

Цитата(Ken @  1.5.2007,  09:07 Найти цитируемый пост)
Не обязательно использовать анонимных классов.

Я не говорю, что обязательно, но без них очень неудобно. Бустовские вещи в данном случае гораздо более гибкое и красивое решение (boost::function, boost::signal, boost::bind, boost::lambda). + действительно в стиле плюсов.


--------------------
PM MAIL ICQ Skype   Вверх
Ken
Дата 1.5.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: 2
Всего: 4



Цитата

Бустовские вещи в данном случае гораздо более гибкое и красивое решение (boost::function, boost::signal, boost::bind, boost::lambda). + действительно в стиле плюсов.


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

Цитата

Просто это со стороны структурного кода работать не будет.


Nerezus для струрного кода используйте указателей на функций как в начале показали товарищи.
Цитата

В C++ можно же при наследовании от 2х классов тип указателя на Child сделать указателем на Parent1(лисенер)?

Да. Это то же самое что реализация интерфейсов в Java (если все методы второго класса абстракные и класс не содержит свои поля). Можете наследовать не только от 2х ;)
PM MAIL   Вверх
Любитель
Дата 3.5.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Ken @  1.5.2007,  12:29 Найти цитируемый пост)
Согласен с вами.

[offtop]Почему с нами?[/offtop]

Цитата(Ken @  1.5.2007,  12:29 Найти цитируемый пост)
Но программируя часто для встроенных систем и микроконтроллеров совсем неприятно увидеть как твой продукт становиться раздутым из за разных библиотек, поэтому если можно обойтись без них, то лучше использовать простые средства которые решают задачу.

Не знаю. Встроенные системы, микроконтроллеры - ничем этим не занимаюсь smile

+ для многих ситуаций хватит STL-вского ФП. Впрочем, дело вкуса, конечно.


--------------------
PM MAIL ICQ Skype   Вверх
archimed7592
Дата 4.5.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Любитель @  3.5.2007,  18:25 Найти цитируемый пост)
для многих ситуаций хватит STL-вского ФП
что за ситуации такие? smile 
я так понимаю речь о bind1st/2nd smile если память не изменяет - у функтора должны быть result_type и прочие грабли smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1567 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.