Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/82: Рейтинг темы: голосов - 82, средняя оценка - 4.96
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

Двойная диспетчеризация :)

31.03.2013, 04:27. Показов 16845. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здорова!
Я тут от пытаюсь понять такое понятие взаимодействия классов или хз как назвать, вообщем что такое двойная диспетчеризация. Так сказать. 4 статьи как бы так бегло прочитал но никак нимогу врубиться, что это такое.
Кто может простыми словами объяснить, что это такое?

Добавлено через 49 секунд
Щас голова тяжолая фиг шо варит

Добавлено через 1 минуту
И еще хочу попытаться смоделировать на примере простых классов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2013, 04:27
Ответы с готовыми решениями:

Виртуальный конструктор(мульти диспетчеризация)
Доброго времени суток. Гуру плюсов, помогите с пояснением смысла вирт. конструктора. Бродя в сети нашел несколько вариаций...

Двойная сумма на C++
Есть такое вот задание: \sum_{i=1}^{n-1} \sum_{j=1}^{n-1} x/(i+j) (В условии есть и произведение, но его скидывать не стал, так как...

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

45
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
22.03.2021, 15:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Покажете код
ой, заработало
C++
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
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <Core/Core.h>
 
#include <variant>
 
using namespace Upp;
 
class line {};
 
class arc {};
 
struct intersects_algo
{
    bool operator()( One<line>&, One<line>&) const
    {
        LOG("line vs line");
        return true;
    }
    bool operator()( One<arc>&,  One<arc>&) const
    {
        LOG("arc vs arc"); 
        return true;
    }
    bool operator()(One<line>&, One<arc>&) const
    {
        LOG("line vs arc"); 
        return true;
    }
    bool operator()(One<arc>& a, One<line>& l) const
        { return this->operator()(l, a); }
};
 
 
template <typename X>
using refwrap = std::reference_wrapper<X>;
 
using element = std::variant<refwrap<One<line>>, refwrap<One<arc>>>;
 
//using element = std::variant<One<line>, One<arc>>;
 
bool intersect(const element& e1, const element& e2  )
{
    return std::visit(intersects_algo(), e1, e2 );
}
 
CONSOLE_APP_MAIN
{
    StdLogSetup(LOG_COUT|LOG_FILE);
    
    One<line> e1;
    e1.Create<line>();
    
    One<arc> e2;
    e2.Create<arc>();
    
    const bool result = intersect(e1, e2);
    
    LOG(result);
}
значит One<> удалит объект и при выходе из scope-функции...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
22.03.2021, 15:16
Цитата Сообщение от JeyCi Посмотреть сообщение
заработало


Цитата Сообщение от JeyCi Посмотреть сообщение
начит One<> удалит объект и при выходе из scope-функции...
Да.

Добавлено через 7 минут
Все проблемы были, видимо, от того, что вы не учли, что One<T> - некопируемый. А по умолчанию variant хочет получить именно копию (о чем я выше как раз говорил). Обойти это можно двумя путями. Либо сразу создать One<T> внутри variant (как вариант - переместить туда существующие объекты - std::move), либо использовать объект-обертку для инкапсуляции ссылки на One<T>.

По большому счету One<T> ничем не примечателен здесь, некопируемые типы встречаются постоянно и внутри и вне std::, это не означает, что std:: не сможет с ними работать.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
22.03.2021, 15:34
во все передачи One<T> вернула const One<..> по совету от U++
•Maintain the const correctness. Failing to do so opens doors to many bugs and makes the usage of your class difficult in classes that maintain it.
кроме объявления в main'e, т.к. там Create на объявлении константного объекта не сработает... и всё норм!

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
std::move
пробовала pick(e1)-перемещающую семантику из upp, но что-то не так, наверно, пробовала...

Добавлено через 5 минут
теперь даже без template работает, а с прежним using element = std::variant<One<line>, One<arc>>; и таким в main'e:
C++
1
const bool result = intersect(pick(e1), pick(e2));
Благодарю!
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
22.03.2021, 16:35
Цитата Сообщение от JeyCi Посмотреть сообщение
перемещающую семантику
так - работает:
C++
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
using element = std::variant<One<line>, One<arc>>;
 
bool intersect(const element& e1, const element& e2  )
{
    return std::visit(intersects_algo(), e1, e2 );
}
 
CONSOLE_APP_MAIN
{
    StdLogSetup(LOG_COUT|LOG_FILE);
   
    One<line> e1;
    e1.Create<line>();
    
    element ea1 = std::move(e1); // e1 теперь не владеет
    
    One<arc> e2;
    e2.Create<arc>();
    
    element ea2 = std::move(e2); // e2 теперь не владеет
    
    const bool result = intersect(ea1, ea2);
    
    LOG(result);
}
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
25.03.2021, 19:12
и так работает - совсем, как #17
C++
1
2
3
4
5
6
7
8
9
10
11
CONSOLE_APP_MAIN
{
    StdLogSetup(LOG_COUT|LOG_FILE);
    
    const element e1=MakeOne<line>();   
    const element e2=MakeOne<arc>();
    
    const bool result = intersect(pick(e1), pick(e2));
    
    LOG(result);
}
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
26.03.2021, 19:14
Цитата Сообщение от JeyCi Посмотреть сообщение
явно не упрощается - ведь лямбда - анонимная функция -- нужен ещё один уровень обобщения, выделяющий конкретную лямбду из всех перегрузок
простенький пример всё-таки оставлю отсюда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <variant>
 
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>;
 
int main() {
    std::variant<int, float, std::string> intFloatString { "Hello" };
    std::visit(overload  {
        [](const int& i) { std::cout << "int: " << i; },
        [](const float& f) { std::cout << "float: " << f; },
        [](const std::string& s) { std::cout << "string: " << s; }
      },
      intFloatString
    );        
}
std::variant в качестве диспетчера и 2я диспетчеризация перегрузкой

Добавлено через 6 минут
p.s.
a compact generic lambda that works for all types held in the variant. - там же
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2021, 19:14

двойная буферизация
Здравствуйте. Ребят не сочтите за труд, помогите разобраться. Проблема собственно вот в чём: Пишу тетрис, в окошке находится стакан с...

Двойная буферизация на С++
Можно её реализовать для консоли, а то больно уж сильно экран мигает. Если можно то подскажите как или линки дайте. Заранее спасибо

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

Двойная спираль в C++
Нужно построить двумерный массив, с заполнением двойной спиралью. Самое сложное что сделать это нужно через один (For). For для вывода...

двойная сортировка
Необходимо отсортировать массив, как показано на рисунке, используя класс/структуру с двумя переменными а (левая колонка) и б (правая...


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

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru