powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тащусь от Qt
6 сообщений из 81, страница 4 из 4
Тащусь от Qt
    #33076478
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интеграторвот один из возможных вариантов
Хм. Понятно :) Комментарии:

1) Если честно, я бы не назвал это решение "Через функторы это разруливается естественным способом" (c) Конструирование прокси-объекта - прием нормальный, но "естественным" я бы назвал решение именно через функтор как таковой, решение, опирающееся на идею функтора. Здесь функтор играет сугубо вспомогательную роль; любая сущность, которая умеет вызвать функцию по указателю, но не является функтором, справится ничуть не хуже.

Что именно это за сущность - предлагаю не уходить в абсолютно теоретические обсуждения. Просто "математически": либо все на свете является функтором, либо примененный аналогично не-функтор справится ничуть не хуже.

2) Далее - придирка к самому "естественно". Я соглашусь, что решение выполнено аккуратно, и - не готов обсуждать, но не удивлюсь, если для конкретной реализации компилятора C++ оно имеет весомые преимущества. Но вариант с inner объектами - все внутри одного класса - мне представляется именно что "естественным" для решения задачи "несколько внутри одного", нежели поддержка вспомогательного списка вспомогательных объектов, "обманывающих" кнопку.
...
Рейтинг: 0 / 0
Тащусь от Qt
    #33076590
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Интеграторвот один из возможных вариантов
Хм. Понятно :) Комментарии:

1) Если честно, я бы не назвал это решение "Через функторы это разруливается естественным способом" (c) Конструирование прокси-объекта - прием нормальный, но "естественным" я бы назвал решение именно через функтор как таковой, решение, опирающееся на идею функтора. Здесь функтор играет сугубо вспомогательную роль; любая сущность, которая умеет вызвать функцию по указателю, но не является функтором, справится ничуть не хуже.

Что именно это за сущность - предлагаю не уходить в абсолютно теоретические обсуждения. Просто "математически": либо все на свете является функтором, либо примененный аналогично не-функтор справится ничуть не хуже.

2) Далее - придирка к самому "естественно". Я соглашусь, что решение выполнено аккуратно, и - не готов обсуждать, но не удивлюсь, если для конкретной реализации компилятора C++ оно имеет весомые преимущества. Но вариант с inner объектами - все внутри одного класса - мне представляется именно что "естественным" для решения задачи "несколько внутри одного", нежели поддержка вспомогательного списка вспомогательных объектов, "обманывающих" кнопку.

Согласен, что пример не самый лучший для демонстрации функторов. Хотлось максимально приблизиться к тому что цитировалось на Java. Конечно более интересноым было бы решение полностью на шаблонах. Если эта тема интересна, можно продолжить обсуждение ;) Код будет правда менее "рантаймным", но с доруго стороны часто это и не нужно ;)
...
Рейтинг: 0 / 0
Тащусь от Qt
    #33084783
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё таки не удержался привести ещё один пример функторами - правда у же не самописными ;)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
class Button  {
public:
  typedef Loki::Functor<void, TYPELIST_1(const char*)>  ListenerType;

  void fireOnClick(const char* szMsg) {
       if (listener_) listener_(szMsg);
  }

   void setListener(const ListenerType& listener) {
       listener_ = listener;
   }

protected:
  ListenerType listener_;
};


void onClick1(const char* szMsg) {
	std::cout << szMsg << std::endl;
}

class BigClass {
   Button btn1_, btn2_, btn3_;
public:
 void onClick2(const char* szMsg) {
	std::cout << szMsg << std::endl;
 }

 void onClick3(const char* szMsg) {
	std::cout << szMsg << std::endl;
 }

 void run() {
    btn1_.setListener(Button::ListenerType(onClick1));
    btn2_.setListener(Button::ListenerType(this, onClick2));
    btn3_.setListener(Button::ListenerType(this, onClick3));

    btn1_.fireOnClick("button 1");
    btn2_.fireOnClick("button 2");
    btn3_.fireOnClick("button 3");

 }

};

...
Рейтинг: 0 / 0
Тащусь от Qt
    #33085262
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИнтеграторВсё таки не удержался привести ещё один пример функторами - правда у же не самописными ;)
Тем не менее, это ровно такое же конструирование вспомогательных объектов. По-прежнему буду утверждать, что такое решение менее "естественно", чем явная реализация того же самого. Позволю себе усложнить задачу - требуется еще и переключать обработчики во время жизни объекта (в зависимости от ситуации присваивать тот или другой вызов). Тогда скрытое создание объектов тут же обернется против программиста.

Давайте забудем, что в яву вроде как добавляют шаблоны. Чем этот код принципиально отличается от

Код: plaintext
1.
2.
btn1.setListener ( new  ButtonListener() {
   public  btnClick() { OnClick1() }});
?

Лично я - считаю такое плохим тоном, но объективности ради - делается.
...
Рейтинг: 0 / 0
Тащусь от Qt
    #33085298
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ИнтеграторВсё таки не удержался привести ещё один пример функторами - правда у же не самописными ;)
Тем не менее, это ровно такое же конструирование вспомогательных объектов. По-прежнему буду утверждать, что такое решение менее "естественно", чем явная реализация того же самого. Позволю себе усложнить задачу - требуется еще и переключать обработчики во время жизни объекта (в зависимости от ситуации присваивать тот или другой вызов). Тогда скрытое создание объектов тут же обернется против программиста.


Честно говоря не понимаю в чём вы видите проблему. Приведите пожалуйста соответвующий код, причём наставиваю на С++ - в Java есть свои фичи и вести разговор по-моему конструктивнее если конкретиризоваться на одном синтаксисе ;)


Давайте забудем, что в яву вроде как добавляют шаблоны. Чем этот код принципиально отличается от

Код: plaintext
1.
2.
btn1.setListener ( new  ButtonListener() {
   public  btnClick() { OnClick1() }});
?

Лично я - считаю такое плохим тоном, но объективности ради - делается.

Принципиально всё сводится к одному и тому же но симантически код с функторами предельно понятен - любому вменяему Сишнику сразу очевидно что делается, а невнимяемый думаю догадается по крайней мере до смысла конструкции ;)
...
Рейтинг: 0 / 0
Тащусь от Qt
    #33086731
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати маленькое дополнение:

Почему вас не смущает код


void func(int nVal) {
// ...
}

int main() {
void (*fn)(int);
fn = func;
// ....
}

и смущает что создаются какие-то дополнительные объекты если вместо указателя на функию применяются функторы ?

Может стоит посмотреть на функуторы просто как на продвинутые указатели ;) ?

Я не хочу спорить что kecit - интерфейсы или функторы, т.к. это разные вещи и в каждом случае отдельно решается что удобнее и гибче...
...
Рейтинг: 0 / 0
6 сообщений из 81, страница 4 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тащусь от Qt
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]