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

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

31.03.2013, 04:27. Показов 16546. Ответов 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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.03.2021, 09:51
Студворк — интернет-сервис помощи студентам
Просто к сведению.
Цитата Сообщение от ninja2 Посмотреть сообщение
31.03.2013
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
19.03.2021, 12:43
Цитата Сообщение от JeyCi Посмотреть сообщение
паттерн Visitor в современном C++ упрощается ещё и использованием лямбд
- перестаралась логически... чтобы не вводить общественность в заблуждения - приложу найденные примеры...
явно не упрощается - ведь лямбда - анонимная функция -- нужен ещё один уровень обобщения, выделяющий конкретную лямбду из всех перегрузок (например из аргумента)
Кликните здесь для просмотра всего текста
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Идиомы и паттерны проектирования в современном С++
// 04b with lambda expressions
#include <iostream>
#include <memory>
 
// --------------------------------- variadic-template
// Generic visitor base
template <typename ... Types>
class Visitor;
 
template <typename T>
class Visitor<T> {
    public:
    virtual void visit(T* t) = 0;
};
 
template <typename T, typename ... Types>
class Visitor<T, Types ...> : public Visitor<Types ...> {
    public:
    using Visitor<Types ...>::visit;
    virtual void visit(T* t) = 0;
};
//
// ---------------------------------
// forward declaration
using PetVisitor = Visitor<class Cat, class Dog>;
 
// ---------------------------------------------- variadic-template
// generic
template <typename Base, typename ... >
class LambdaVisitor;
 
// tail case
template <typename Base, typename T1, typename F1>
class LambdaVisitor<Base, Visitor<T1>, F1> : private F1, public Base {
    public:
    LambdaVisitor(F1&& f1) : F1(std::move(f1)) {}
    LambdaVisitor(const F1& f1) : F1(f1) {}
    void visit(T1* t) override { return F1::operator()(t); }
};
 
// base case
template <typename Base, typename T1, typename ... T, typename F1, typename ... F>
class LambdaVisitor<Base, Visitor<T1, T ...>, F1, F ...> : private F1, public LambdaVisitor<Base, Visitor<T ...>, F ...> {
    public:
    LambdaVisitor(F1&& f1, F&& ... f) : F1(std::move(f1)), LambdaVisitor<Base, Visitor<T ...>, F ...>(std::forward<F>(f) ...) {}
    LambdaVisitor(const F1& f1, F&& ... f) : F1(f1), LambdaVisitor<Base, Visitor<T ...>, F ...>(std::forward<F>(f) ...) {}
    void visit(T1* t) override { return F1::operator()(t); }
};
 
// нужно явно выделить тип лямбды из аргументов шаблона -- ? => лишний level обобщения ?
template <typename Base, typename ... F>
auto lambda_visitor(F&& ... f) {
    return LambdaVisitor<Base, Base, F ...>(std::forward<F>(f) ...);
}
//
// ---------------------------------------------- CRTP
 
class Pet {
    public:
    virtual ~Pet() {}
    Pet(const std::string& color) : color_(color) {}
    const std::string& color() const { return color_; }
    virtual void accept(PetVisitor& v) = 0;
    private:
    std::string color_;
};
 
template <typename Derived>
class Visitable : public Pet {
    public:
    using Pet::Pet;
    void accept(PetVisitor& v) override {
        v.visit(static_cast<Derived*>(this)); 
    }
};
 
class Cat : public Visitable<Cat> {
    using Visitable<Cat>::Visitable;
};
 
class Dog : public Visitable<Dog> {
    using Visitable<Dog>::Visitable;
};
// ----------------------------------------------
class FeedingVisitor : public PetVisitor {
    public:
        // overloading....
    void visit(Cat* c) override { std::cout << "Feed tuna to the " << c->color() << " cat" << std::endl; }
    void visit(Dog* d) override { std::cout << "Feed steak to the " << d->color() << " dog" << std::endl; }
};
 
class PlayingVisitor : public PetVisitor {
    public:
        // overloading.....
    void visit(Cat* c) override { std::cout << "Play with feather with the " << c->color() << " cat" << std::endl; }
    void visit(Dog* d) override { std::cout << "Play fetch with the " << d->color() << " dog" << std::endl; }
};
// ----------------------------------------------
void walk(Pet& p) {
    auto v(lambda_visitor<PetVisitor>(
             [](Cat* c) { std::cout << "Let the " << c->color() << " cat out" << std::endl; },
             [](Dog* d) { std::cout << "Take the " << d->color() << " dog for a walk" << std::endl; }
    ));
    p.accept(v);
}
 
int main() {
    std::unique_ptr<Pet> c(new Cat("orange"));
    std::unique_ptr<Pet> d(new Dog("brown"));
 
    FeedingVisitor fv;
    c->accept(fv);
    d->accept(fv);
 
    PlayingVisitor pv;
    c->accept(pv);
    d->accept(pv);
 
    walk(*c);
    walk(*d);
}

по сравненю с вариантом Посетителя без лямбд
Кликните здесь для просмотра всего текста
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
59
60
61
62
63
64
65
66
67
// 01a with template Visitable
#include <iostream>
#include <memory>
// ----------------------------------------------
// forward declaration
class Cat;
class Dog;
// ---------------------------------------------- Visitor Base
class PetVisitor {
    public:
    virtual void visit(Cat* c) = 0;
    virtual void visit(Dog* d) = 0;
};
// ---------------------------------------------- CRTP
class Pet {
    public:
    virtual ~Pet() {}
    Pet(const std::string& color) : color_(color) {}
    const std::string& color() const { return color_; }
    virtual void accept(PetVisitor& v) = 0;
    private:
    std::string color_;
};
 
template <typename Derived>
class Visitable : public Pet {
    public:
    using Pet::Pet;
    void accept(PetVisitor& v) override {
        v.visit(static_cast<Derived*>(this)); 
    }
};
 
class Cat : public Visitable<Cat> {
    using Visitable<Cat>::Visitable;
};
 
class Dog : public Visitable<Dog> {
    using Visitable<Dog>::Visitable;
};
// ---------------------------------------------- Visitor Derived
class FeedingVisitor : public PetVisitor {
    public:
        // overloading.....
    void visit(Cat* c) override { std::cout << "Feed tuna to the " << c->color() << " cat" << std::endl; }
    void visit(Dog* d) override { std::cout << "Feed steak to the " << d->color() << " dog" << std::endl; }
};
 
class PlayingVisitor : public PetVisitor {
    public:
        // overloading.....
    void visit(Cat* c) override { std::cout << "Play with feather with the " << c->color() << " cat" << std::endl; }
    void visit(Dog* d) override { std::cout << "Play fetch with the " << d->color() << " dog" << std::endl; }
};
// ---------------------------------------------- 
int main() {
    std::unique_ptr<Pet> c(new Cat("orange"));
    std::unique_ptr<Pet> d(new Dog("brown"));
 
    FeedingVisitor fv;
    c->accept(fv);
    d->accept(fv);
 
    PlayingVisitor pv;
    c->accept(pv);
    d->accept(pv);
}


Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Просто к сведению.
в общем, да... уже прозвучало в #17, что в std вместо паттерна уже даже нужный класс появился, реализующий этот паттерн... просто не всегда хочется полагаться на std в стороннем Фреймворке и на сторонней куче (сторонней по отношению к std)
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
19.03.2021, 12:53
JeyCi, а так не нравится? )

C++
1
2
3
4
5
6
7
void walk(Pet& p) {
    auto v(lambda_visitor<PetVisitor>([](auto* pet)
    {
         std::cout << "Let the " << pet->color() << " pet out" << std::endl; },
    ));
    p.accept(v);
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.03.2021, 13:23
Цитата Сообщение от JeyCi Посмотреть сообщение
и на сторонней куче
В std::variant нет использования кучи.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
19.03.2021, 13:33
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а так не нравится? )
сначала у компилятора спрашивайте, не у меня...

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
В std::variant нет использования кучи.
это пока нет... пока туда не положить объекты, расположенные на куче... и обёрнутые в смарт-пойнтеры... но ваше уточнение приму на заметку
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
19.03.2021, 13:35
JeyCi, компилятор доволен )
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.03.2021, 14:23
Цитата Сообщение от JeyCi Посмотреть сообщение
пока туда не положить объекты, расположенные на куче... и обёрнутые в смарт-пойнтеры...
Так от этого в std::variant куча не появится. Это будут внешние ресурсы по отношению к нему. Сами-то смартпойнтеры прекрасненько внутри будут лежать без использования какой-либо кучи.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
19.03.2021, 20:46
Цитата Сообщение от Алексей1153 Посмотреть сообщение
компилятор доволен )
что-то мой mingw пока сопротивляестся...
error: cannot convert 'LambdaVisitor<Visitor<Cat, Dog>, Visitor<Cat, Dog>, walk(Pet&)::<lambda(auto:1*)> >' to 'PetVisitor&' {aka 'Visitor<Cat, Dog>&'}
на следующую строку после вашего auto v - p.accept(v);

Добавлено через 8 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Так от этого в std::variant куча не появится.
у меня пока выбрасывает ошибкой на upp std::new_allocator... я же хочу внедрить это в код с upp namespace и минимально от std (или вообще без него) ... вобщем тестирую, экспериментирую, найду ок вариант - смогу сказать больше... тут дело ещё может быть в правильной регистрации пользовательской иерархии в upp_Фреймворке (чтобы норм в др обёртки входило, ведь периодически ругается, что не cast'ится)... вобщем пока осваиваю новые горизонты... все идеи принимаю на заметку, доверяю только работающему коду в моих реалиях...

Добавлено через 5 минут
просто всё началось с этой задачи... думается мне, что там как-то ответ с точностью до наоборот дан?.. т.е. иерархию надо делаь по Element (crtp), а перегрузку вставить в helper (и возможно, и не нужно будет городить иерархию от helper)... что-то не даёт тот код спокойно вздохнуть... ведь может пригодиться
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
20.03.2021, 19:56
Цитата Сообщение от JeyCi Посмотреть сообщение
просто всё началось с этой задачи... думается мне, что там как-то ответ с точностью до наоборот дан?.. т.е. иерархию надо делаь по Element (crtp), а перегрузку вставить в helper (и возможно, и не нужно будет городить иерархию от helper)... что-то не даёт тот код спокойно вздохнуть...
... в общем не понятно, зачем там 2ая иерархия - если она всё равно ElementAEditor или ElementBEditor... соответствующие Edit() можно засунуть и в сами ElementA или ElementB подклассы 1ой иерархии... как-то очень за уши там притянута задача к 2м иерархиям...
- а если и будут нужны 2 иерархии, то паттерн Мост - это уже совсем др. тема...
а паттерн Посетитель - это, действительно, не по той задаче
Конкретные посетители реализуют какое-то особенное поведение для всех типов элементов, которые можно подать через методы интерфейса посетителя
(да и тому ТСу самому не нравится этот паттерн к его задаче)
... в общем, пока не люблю задачи, оторванные от жизни...
при случае пересмотрю на своих реалиях... случай - это возникновение реальной проблемы, требующей решения подобным (посетитель) образом [нужность выделения алгоритма в отдельный интерфейс, например, по причине частых изменений в алгоритмах]... или на досуге...
всем спасибо за view

Добавлено через 4 минуты
p.s.
а ведь всё равно, что лишний балласт перенести в pImpl - только это др. балласт (алгоритмический) и перенести предлагается в отдельную иерархию, если всё-таки разрастётся... в отличие от pImpl, который private part в отдельный класс... - просто для ускорения частичной перекомпиляции проекта
- так и Посетитель может пригодится
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
21.03.2021, 16:40
Цитата Сообщение от JeyCi Посмотреть сообщение
на своих реалиях...
U++ IDE - pattern Visitor так работает (crtp не использовала для создания иерархии):
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
59
60
61
62
63
64
65
66
67
68
69
70
#include <Core/Core.h>
 
using namespace Upp;
 
class Derived1;
class Derived2;
 
class visitor {
    public:
    virtual void visit(Derived1& el) = 0;
    virtual void visit(Derived2& el) = 0;
};
    
class visitor_greeting: public visitor {
    public:
    virtual void visit(Derived1& el) override{
        LOG("I am greeting_visitor; my congratulations to Derived1");
    };
    virtual void visit(Derived2& el) override{
        LOG("I am greeting_visitor; my congratulations to Derived2");  
    };
};
 
struct Base {
    virtual double get() const = 0;
    String ToString() const { return AsString(get()); }
    virtual ~Base() {}
    virtual void accept(visitor& v) = 0;
}; 
 
struct Derived1 : Base {
    int n;
    virtual double get() const { return n; }
    virtual void accept(visitor& v) override {v.visit(*this);}
};
 
struct Derived2 : Base {
    double n;
    virtual double get() const { return n; }
    virtual void accept(visitor& v) override {v.visit(*this);}
};
 
 
CONSOLE_APP_MAIN
{    
    StdLogSetup(LOG_COUT|LOG_FILE);
    
    visitor_greeting pv;
    
    Array<Base> arr;
    arr.Create<Derived1>().n = 15;
    arr.Create<Derived2>().n = 3.5;
    for (int i=0;i<arr.GetCount();i++) {
        LOG(arr[i].ToString());
        arr[i].accept(pv);
    }
    LOG("================================");
    One<Base> s;
    s.Create<Derived1>().n=4;
    s.Create<Derived2>().n=5.5;
    LOG(s->get());
    LOG(s.Is<Derived2>());
    s->accept(pv);  // 'class Upp::One<Base>' has no member named 'accept' => used pointer to Parent
    
    // To get a pointer to the contained instance, use operator~:
    Base *a = ~s;
    LOG(a->get());  
    
    a->accept(pv);
}
практически

Добавлено через 53 минуты
плюсы:
• новая функциональность в несколько классов добавляется сразу, не изменяя код этих классов;
• позволяет получить информацию о типе объекта;
• двойная диспетчеризация;
возможность описания своего алгоритма для каждого типа объектов.
Шаблон следует использовать, если:
- имеются различные объекты разных классов с разными интерфейсами, но над ними нужно совершать операции, зависящие от конкретных классов;
- необходимо над структурой выполнить различные, усложняющие структуру операции;
- часто добавляются новые операции над структурой.
... или variant_visit (см. ранее)

Добавлено через 7 минут
? на заметку
•Является классической техникой для восстановления потерянной информации о типе.
Добавлено через 2 минуты
и вариант для всё-таки творческого подхода на habr'e - чтобы уж точно инжинерное дело довести до логического конца...
0
0 / 0 / 0
Регистрация: 21.03.2021
Сообщений: 2
21.03.2021, 16:44
здравствуйте, я новичок на этом сайте, подскажите пожалуйста как создать новую тему (задать вопрос)
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
21.03.2021, 19:23

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
инжинерное
вот что значит думать по-английски и писать по-русски...
8.Избегайте грамматических ошибок при написании сообщений


kote5615, вы тоже найдите вверху слева вкладку Правила!.. под ней найдёте всё остальное, что вам надо, - изучите страницу, прежде, чем изучать язык, - её дизайн - тоже высшее достижение инженерной мысли и ювелирного мастерства... - дерзайте, изучайте...
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
22.03.2021, 10:58
Цитата Сообщение от DrOffset Посмотреть сообщение
Так от этого в std::variant куча не появится. Это будут внешние ресурсы по отношению к нему. Сами-то смартпойнтеры прекрасненько внутри будут лежать без использования какой-либо кучи.
да, действительно, просто роль смарт пойнтера в Upp исполняет контейнер One<> ... и, видимо , можно отправить в std::variant ссылку на содержащийся в One объект... если всё норм, то One удалит объект при выходе из main..... подправила код от hoggy для Upp
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
#include <Core/Core.h>
 
#include <variant>
 
using namespace Upp;
 
class line {};
 
class arc {};
 
struct intersects_algo
{
    bool operator()( const line&, const line&) const
    {
        LOG("line vs line");
        return true;
    }
    bool operator()( const arc&,  const arc&) const
    {
        LOG("arc vs arc"); 
        return true;
    }
    bool operator()(const line&, const arc&) const
    {
        LOG("line vs arc"); 
        return true;
    }
    bool operator()(const arc& a, const line& l) const
        { return this->operator()(l, a); }
};
 
using element = std::variant<line, 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);
}
но, может, std::variant словит исключение... - не словит, только если null от pointer'a... на случай если совит (при передаче ссылки на объект, а не указателя) - думаю, идиома swap будет в помощь...
т.е., в принципе, совместное использование std и Upp - реально... и куча уже не страшна всем спасибо!
... как уже цитировала где-то:
Гради Буч в своей книге «Объектно-ориентированный анализ и проектирование с примерами приложений на C++» [11] отмечает, что «источником множества ошибок в объектно-ориентированном программировании является неумение отличать имя объекта от самого объекта».
- ведь, действительно, std::variant принимает лишь ссылки в данном примере, и чтобы не share-ить владение, One-контейнер, выполняющий роль unique_ptr в U++ IDE, в данном примере норм исполняет свою функцию... имхо
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
22.03.2021, 11:17
Цитата Сообщение от JeyCi Посмотреть сообщение
std::variant принимает лишь ссылки в данном примере
В данном примере std::variant содержит копии объектов типов line и arc соответственно. Не ссылки.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
22.03.2021, 11:35
ну в сигнатуре ссылки имела ввиду... а передаются в функцию да - копии здесь... зачем мне выдёргивать из One сами объекты (на куче), если One их прекрасно удалит сам... а копии в функции удалятся при выходе из scope функции...
просто в методах One - по сигнатуре operator*() возвращает const T&, которая (ссылка) и отправляется в аргументы функции...
над exceptions в bool intersect, наверно, ещё подумать надо (но, ясно, - даже swap-ить не придётся - т.к. возвращать ничего из полученных в функцию объектов не придётся) ... хотя идиома swap - для конструкторов и деструкторов... но, думаю, здесь в классах arc() и line() она тоже не пригодиться... имхо?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
22.03.2021, 11:37
Цитата Сообщение от JeyCi Посмотреть сообщение
которая и отправляется в аргументы функции...
Тут неявно происходит следующее:
C++
1
const bool result = intersect(element(*e1), element(*e2));
Тут получается два временных объекта типа element, содержащих копии *e1 и *e2 соответственно.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
22.03.2021, 11:51
Цитата Сообщение от DrOffset Посмотреть сообщение
получается два временных объекта типа element, содержащих копии *e1 и *e2 соответственно.
упс... а я уже думала, что красивее будет с One<>-обёрткой оправить в функцию... но что-то std::variant не принимал Контейнеры (т.к. One - это контейнер по сути) - писал, что не создаст мне Upp::One<std::variant<line,arc>>* вроде на это using element = std::variant<line, arc>; ... вобщем, попробую ещё

Добавлено через 2 минуты
придётся в сами line и arc классы вставлять оборачивание в One<>
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
22.03.2021, 12:12
JeyCi, если std::variant нужен только в качестве диспетчера внешних объектов, чтобы сработал visit, то можно сделать так:
C++
1
2
3
4
template <typename X>
using refwrap = std::reference_wrapper<X>;
 
using element = std::variant<refwrap<line>, refwrap<arc>>;
остальной код останется прежним.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
22.03.2021, 14:43
НЕТ, просто для std::variant - One<T> - это вообще не тип!... std::variant потом ни declval не может сделать, ни __variants.valueless_by_exception() - вообще ничего не может сделать с типом One ... выдаёт template argument deduction/substitution failed: и дальше везде ссылается на то, что с One<T> ничего не может сделать... тут без обёртки отправлять в функцию лучше...
но т.к. в Upp в принципе в большинстве своём ничто не создаётся через new, а предпочтительно в контейнерах, то указатели используются только если для указания на объект, а не на место в куче... поэтому и не могу смоделировать отправку в функцию intersect и в обработку variant_visit указатель на место в куче... пока ещё не добралась до кучи в Upp (да и не советуют они)...
ваш последний вариант работает так же, как мой #33... ref_wrapper приму на заметку- спасибо...
но думается мне, что тут главное Правильно проходить boundary (условно говоря) между 2мя namespaces... не пытаться скармливать STD то, что она в глаза не видела т.е. One<T>...
P.S.
если уж ну очень сильно придётся создать что-то на куче, то создавать природные для STD вещи и заворачивать в её родные smart-pointers
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
22.03.2021, 14:50
Цитата Сообщение от JeyCi Посмотреть сообщение
НЕТ, просто для std::variant - One<T> - это вообще не тип!
Очень похоже на то, что вы просто что-то не так поняли\делаете.

Цитата Сообщение от JeyCi Посмотреть сообщение
template argument deduction/substitution failed
После этого еще больше похоже.

std::variant сам по себе скорее всего не при чем.

Покажете код, на котором возникает эта проблема?

Добавлено через 3 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
ваш последний вариант работает так же, как мой #33
Не совсем так. В вашем варианте вы работаете с независимыми копиями. А в моем - с объектами, лежащими внутри One<T> (где T - arc и line).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2021, 14:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru