Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для prokl9tiy
21 / 21 / 9
Регистрация: 09.10.2016
Сообщений: 113

Собираются ли вводить делегаты?

24.01.2017, 23:50. Показов 1720. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
или так и собираются строго придерживаться тому, что есть - писать уже с имеющегося кучу кода вместо того, чтобы сделать это встроенным?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2017, 23:50
Ответы с готовыми решениями:

Не собираются проекты в QtCreator
При сборке проекта в Creator ругается на platform plugins. Говорит, что нету. Вроде в path всё прописал, но всё равно та же ошибка. Что...

Непонятные шаблоны, в библиотечку не собираются.
Вопрос: stlport и иже с ними оформлены как библиотеки (lib, so, dll). При объявлениии шаблонов, таких, в программе нет ругани компилятора,...

Не собираются уроки NeHe по OpenGL (Code::Blocks)
Решил попробовать уроки NeHe по OpenGL.... Какая печаль.... после того как я написал куча ошибок в коде. Да скорее всего это из за моего...

35
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2017, 00:30
Не собираются.

А чем не устраивают лямбда-функции, функторы, std::function, std::bind, шаблоны в конце-концов?

Можете привести пример профита от их внедрения и как вы себе представляете их синтаксис?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.01.2017, 02:26
Цитата Сообщение от MrGluck Посмотреть сообщение
А чем не устраивают лямбда-функции, функторы, std::function,
Задуренной трудно читаемой инициализацией делегата.
Цитата Сообщение от MrGluck Посмотреть сообщение
шаблоны в конце-концов
Тоже костыль только с немного менее трудно читаемым синтаксисом.
Основной недостаток как лямбда так и шаблоных костылей по сравнению с нативными делегатами - VMT лукап в момент вызова а не в момент инициализации. НУ и даже при наличии рефлекшина попытки сериализации/десериализации иерархий объектов имеющих связи в виде делегатов будет та еще пляска с бубном даже при наличии свойств и рефлекшина.

Цитата Сообщение от MrGluck Посмотреть сообщение
Можете привести пример профита от их внедрения синтаксис?
Профита как минимум 3 - повышение читабельности кода, снижение накладных расходов на вызов, достаточно простая схема распознания делегата в полном RTTI позволяющая в купе с рефлекшином и свойствами достаточно просто реализовывать автоматическую внешнюю сериализацию/десериализацию и внешнее визуальное редактирование связей.
Цитата Сообщение от MrGluck Посмотреть сообщение
и как вы себе представляете их синтаксис?
C++
1
2
3
4
5
6
7
8
//объявление типа делегата:
typedef ReturnType (__closure *TMyEvent)(Args);
 
//инициализация:
Sender.OnEvent=Reciever.Handler;
 
// вызов 
OnEvent(Args);
Такая схема синтаксиса промышленно используется в профессиональных компиляторах уже более 20 лет без изменений
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.01.2017, 12:00
А указатели на функции уже не в моде?

Fulcrum_013,
Немного не понятно про рефлекшены, разве они есть в С++?
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
25.01.2017, 12:33
Большинство реализаций делегатов, которые написаны под С++, раскрываются в момент компиляции, что крайне урезает их функционал.

Я себе написал класс реалтаймовых делегатов, использующих указатели на метод функции и horrible_cast (Функторов и замыканий, правда не поддерживает...).
Имеет крайне компактную реализацию, строк максимум на 200... Проблема только в том, что механизмы, на основе которых строится вызов делегированной функции ни разу не стандартизованы. Я работаю с g++ и понятия не имею, запустятся ли мои делегаты с каким-то другим компилятором.

Впрочем, оно работает.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
25.01.2017, 16:06
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Задуренной трудно читаемой инициализацией делегата.
Как мне сделать на твоих делегатах че-нить типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <functional>
#include <iostream>
 
void handle(bool connected, int status)
{
  std::cout << connected << " " << status << "\n";
}
 
int main() {
 
  auto onConnectedEvent = std::bind(&handle, true, std::placeholders::_1);
  auto onDisconnectedEvent = std::bind(&handle, false, std::placeholders::_1);
 
  int status = 400;
  onConnectedEvent(status);
  onDisconnectedEvent(status);
 
  return 0;
}
http://ideone.com/Z9tIeF

Добавлено через 6 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
А указатели на функции уже не в моде?
Ты к нам из 80-х?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.01.2017, 16:10
Цитата Сообщение от Mirmik Посмотреть сообщение
Большинство реализаций делегатов, которые написаны под С++, раскрываются в момент компиляции, что крайне урезает их функционал.
что именно там урезается?

я вот такой делал:
C++
1
2
3
4
5
6
7
8
9
10
some foo(int,int);
 
...
connector con(foo, 10); //<--- прицеливается на функцию foo, и биндит один из аргументов
 
some result = con(20); //<--- эквивалентно foo(10,20);
 
tconnector<some(int,int)> tcon = con; //<--- совместим с более эффективной статической версией
 
std::function<some(int,int)> tcon = con; //<--- совместим с стандартным делегатом

думаю, сегодня динамический делегат велосипедится на порядок проще, чем во времена с++03
вот только зачем? мне динамический понадобился в итоге только раз в жизни.
да и то, для динамики можно было бы поюзать:

C++
1
2
3
4
using var = std::any;
using connector = std::function<var(const var&)>;
...
connector  con = foo;
и не тратить время на велосипед.

Добавлено через 38 секунд
Цитата Сообщение от Voivoid Посмотреть сообщение
Как мне сделать на твоих делегатах че-нить типа такого:
никак. но он начнет нести пургу по типу: "такое и не нужно"
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.01.2017, 16:17
Цитата Сообщение от Voivoid Посмотреть сообщение
Ты к нам из 80-х?
Нет )) Но проще всего на мой взгляд сделать указатель на функцию если говорить о делегатах
Если нужен тип, то добавить typedef, делов то...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2017, 16:20
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но проще всего на мой взгляд сделать указатель на функцию если говорить о делегатах
Если нужен тип, то добавить typedef, делов то...
Этим сейчас пользуются только сишные старпёры. std::function позволяет создавать объекты более обобщённых типов, которые могут хранить в том числе указатели на функции/методы, вообще всё, что соответствует заявленной сигнатуре.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
25.01.2017, 16:20
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
tconnector<some(int,int)> tcon = con; //<--- совместим с более эффективной статической версией
std::function<some(int,int)> tcon = con; //<--- совместим с стандартным делегатом
А начиная с с++17 ещё проще!
C++
1
2
tconnector tcon = con; //<--- совместим с более эффективной статической версией
std::function tcon = con; //<--- совместим с стандартным делегатом
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.01.2017, 16:57
MrGluck,
Ну я бы не стал в данном случае указывать в качестве козыря обобщенность потому что её так же можно достигнуть с помощью указателей на функции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template<typename T> 
using test = void(*)(T);
 
void bar(int n)
{
    std::cout << n;
}
 
int main()
{
    test<int> f = bar;
    f(200);
}
Там скорее удобство что "из коробки".
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2017, 17:22
Цитата Сообщение от sys_beginner Посмотреть сообщение
её так же можно достигнуть с помощью указателей на функции.
И что вы предлагаете делать с указателями на нестатические методы (то есть когда фактически нужен биндинг)?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
25.01.2017, 17:23
Цитата Сообщение от sys_beginner Посмотреть сообщение
C++
1
2
template<typename T> 
using test = void(*)(T);
и как теперь его поюзать с методом класса?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2017, 17:28
Я про такую ситуацию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <functional>
#include <iostream>
 
struct A
{
    void foo(int x)
    {
        std::cout << x;
    }
} a;
 
int main()
{
    using test = void(*)(int);
    std::function<void(int)> f = std::bind(&A::foo, &a, std::placeholders::_1);
    //test f = ?;
    f(200);
}
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.01.2017, 17:41
Цитата Сообщение от MrGluck Посмотреть сообщение
И что вы предлагаете делать с указателями на нестатические методы (то есть когда фактически нужен биндинг)?
Цитата Сообщение от Raali Посмотреть сообщение
и как теперь его поюзать с методом класса?
Есть вариант, но правда немного сложновато получилось...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
template<class C, typename T> 
using test = void(C::*)(T);
 
class Cls
{
    public:
    void bar(int n)
    {
        std::cout << n;
    }
    
};
 
 
int main()
{
    Cls obj;
    
    test<Cls, int> f = &Cls::bar;
    (obj.*f)(200);
}
Добавлено через 33 секунды
Но результат... чем не биндинг?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
25.01.2017, 17:46
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но результат... чем не биндинг?
дак смысл в том чтобы не писать 2 разных типа для 2 разных функций)
а юзать один std::function<void(int)>, как для простой функции, так и для метода, так и для много чего другого

Добавлено через 2 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
(obj.*f)(200);
да и вызывать будет проще - во всех случаях - f(200);
но не только в простоте дело, а в том что тот кто использует делегат - ничего не знает - метод это или просто функция
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.01.2017, 17:47
Цитата Сообщение от Raali Посмотреть сообщение
дак смысл в том чтобы не писать 2 разных типа для 2 разных функций)
а юзать один std::function<void(int)>, как для простой функции, так и для метода, так и для много чего другого
А разве variadic templates не решает эту проблему?

Цитата Сообщение от Raali Посмотреть сообщение
да и вызывать будет проще
Ну я этого не отрицал
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2017, 17:51
Цитата Сообщение от sys_beginner Посмотреть сообщение
Есть вариант, но правда немного сложновато получилось...
Помимо ненужной сложности, вы не сможете присвоить такому объекту указатель на обычную функцию/метод со схожей сигнатурой.
C++
1
std::function<void(int)> f[] = {std::bind(&A::foo, &a, std::placeholders::_1), [](int) {}};
Добавлено через 43 секунды
Цитата Сообщение от sys_beginner Посмотреть сообщение
А разве variadic templates не решает эту проблему?
Они решают совершенно другую проблему.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.01.2017, 18:07
Цитата Сообщение от GbaLog- Посмотреть сообщение
А начиная с с++17 ещё проще!
этого не может быть)
без пруфлинка не поверю)

Добавлено через 3 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
чем не биндинг?
вот этим не биндинг:
Цитата Сообщение от sys_beginner Посмотреть сообщение
(obj.*f)(200);
был бы биндинг, можно было бы сделать:
C++
1
(obj.*f)();  // забинженный ранее аргумент подставится автоматом
ваш шаблонно-указатель - не нужен.
совершенно не практичный костыль.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
25.01.2017, 18:15
Цитата Сообщение от hoggy Посмотреть сообщение
без пруфлинка не поверю)
http://www.open-std.org/jtc1/s... 091r3.html
А всё вообще(возможно, что не всё): http://stackoverflow.com/quest... res-in-c17

Добавлено через 3 минуты
Хотя стоп, дата 30 июня, теперь и я сомневаюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2017, 18:15
Помогаю со студенческими работами здесь

В российском пиве собираются ограничить содержание мышьяка, ртути и клещей
Заголовок новости наводит на размышления :D В пиве должно быть ограничено содержание вредных веществ: свинца, мышьяка, кадмия, ртути,...

Нужны ссылки на чаты (или подобное-irc) где програмеры собираются
Помогите.. если кто знает... где прогманы(VB желательно) собираются в инете... хотелось бы - Русские ресурсы. Нужно непосредственное...

Здраствуйте... нужна ссылка на чаты или irc по vb где пргманы собираются
форумы долго и еще не известно ответят или нет. но все прогманы должны гдето собираться? неужели они не создали места для себя? Ведь они...

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

Не собираются qsqlmysql.dll и qsqlmysqld.dll под qt 5.1.1 mingw4.8
Пользуясь вот этой статьёй http://seppemagiels.com/blog/create-mysql-driver-qt5-windows#mysql_path_note Пытался собрать mysql driver....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru