Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8

Реализация класса Number на основе идиомы (type erasure) C++11

30.11.2022, 21:58. Показов 1124. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется заготовка класса Number построенного на идиоме type erasure. Необходимо в данном классе реализовать унарные и бинарные операции с числами. На данный момент не совсем понятно как их реализовать так как в классе Number неизвестен тип Base. Есть идея решить задачу введя дополнительное поле отвечающее за тип через перечисление. Определение типа в операциях реализовать через механизм switch case. В таком случае объём программного кода вырастает и появляется большое количество повторяющегося кода с определением типа данных.


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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <type_traits>
#include <typeinfo>
#include <fstream>
#include <iostream>
 
using float32_t = float;
using float64_t = double;
using float80_t = long double;
 
enum class Type_Number{
    INT8,
    INT16,
    INT32,
    INT64,
    UINT8,
    UINT16,
    UINT32,
    UINT64,
    FLOAT32,
    FLOAT64,
    FLOAT80,
    NONTYPE
};
 
template <typename T>
constexpr bool is_allow_type_num =
        std::is_same<T, int8_t>::value ||
        std::is_same<T, int16_t>::value ||
        std::is_same<T, int32_t>::value ||
        std::is_same<T, int64_t>::value ||
        std::is_same<T, uint8_t>::value ||
        std::is_same<T, uint16_t>::value ||
        std::is_same<T, uint32_t>::value ||
        std::is_same<T, uint64_t>::value ||
        std::is_same<T, float32_t>::value ||
        std::is_same<T, float64_t>::value ||
        std::is_same<T, float80_t>::value;
 
 
class Number {
private:
    struct Base {
        virtual ~Base(){};
        virtual Base * get_copy() = 0;
        virtual std::string to_string() = 0;
        virtual void to_file(std::fstream &) = 0;
        virtual void to_console(std::ostream &) = 0;
 
        //унарные операции
 
        //бинарные операции
    };
 
    template <typename T>
    struct Derived: public Base {
        T m_value;
 
        Derived(const T & value): m_value(value){}
        Base * get_copy() override { return new Derived<T>(m_value); }
        std::string to_string() override { return std::to_string(m_value); }
        void to_file(std::fstream &out) override { out << m_value; }
        void to_console(std::ostream &out) override { out << m_value; }
 
        //унарные операции
 
 
        //бинарные операции
    };
 
    template <typename T1, typename T2>
    bool is_type(T2){ return (typeid (T1) == typeid (T2)); }
 
    template <typename T>
    Type_Number typedata(const T d)
    {
        if (is_type<int8_t>(d))
            return Type_Number::INT8;
        else if (is_type<int16_t>(d))
            return Type_Number::INT16;
        else if (is_type<int32_t>(d))
            return Type_Number::INT32;
        else if (is_type<int64_t>(d))
            return Type_Number::INT64;
 
        else if (is_type<uint8_t>(d))
            return Type_Number::UINT8;
        else if (is_type<uint16_t>(d))
            return Type_Number::UINT16;
        else if (is_type<uint32_t>(d))
            return Type_Number::INT32;
        else if (is_type<uint64_t>(d))
            return Type_Number::INT64;
 
        else if (is_type<float32_t>(d))
            return Type_Number::FLOAT32;
        else if (is_type<float64_t>(d))
            return Type_Number::FLOAT64;
        else if (is_type<float64_t>(d))
            return Type_Number::FLOAT80;
        else
            return Type_Number::NONTYPE;
    }
 
    Type_Number m_type_data = Type_Number::NONTYPE;
 
    Base *m_storage = nullptr;
public:
    //ограничить возможные типы данных
    template <typename U, typename DUMMY =
              typename std::enable_if <is_allow_type_num<U>>::type>
    Number(const U& value){
        m_storage = new Derived<U>(value);
    }
 
    ~Number(){
        delete m_storage;
    }
 
    Number(const Number& a): m_storage(a.m_storage->get_copy()){}
 
    Number& operator = (const Number &value) {
        delete m_storage;
        m_storage = value.m_storage->get_copy();
        return *this;
    }
 
    template <typename U, typename DUMMY =
              typename std::enable_if <is_allow_type_num<U>>::type>
    Number& operator = (const U &value) {
        delete m_storage;
        m_storage = new Derived<U>(value);
        return *this;
    }
 
    std::string to_string(){
        return m_storage->to_string();
    }
 
    friend std::ostream& operator << (std::ostream& out, const Number& a){
        a.m_storage->to_console(out);
        return out;
    }
 
    friend std::fstream& operator << (std::fstream& out, const Number& a){
        a.m_storage->to_file(out);
        return out;
    }
 
    friend Number& operator + (const Number& nl, const Number &nr){
    //?????
    //использовать механизм switch case
    }
 
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2022, 21:58
Ответы с готовыми решениями:

Реализация класса Number
Есть следующее задание: Создать абстрактный класс Number c виртуальными методами, реализующими арифметические операции. На его основе...

const n=20; type number=0.9; num= array[1.n] of number; var a,b,c: num; t: boolean;
Помогите решить пожалуйста) const n=20; type number=0..9; num= array of number; var a,b,c: num; t: boolean; ...

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

2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
30.11.2022, 22:43
Цитата Сообщение от Fdr15 Посмотреть сообщение
Есть идея решить задачу введя дополнительное поле отвечающее за тип через перечисление. Определение типа в операциях реализовать через механизм switch case. В таком случае объём программного кода вырастает и появляется большое количество повторяющегося кода с определением типа данных.
Используйте виртуальные функции.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.11.2022, 22:47
Цитата Сообщение от Fdr15 Посмотреть сообщение
Необходимо в данном классе реализовать унарные и бинарные операции с числами. На данный момент не совсем понятно как их реализовать так как в классе Number неизвестен тип Base
см паттерн двойная диспетчеризация

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
#include <variant>
#include <iostream>
 
struct line {};
 
struct arc {};
 
struct item {};
 
using element = std::variant<line, arc, item>;
 
struct intersects_algo
{
    bool operator()(const line&, const line&) const
    {
        std::cout<<"line vs line";
        return true;
    }
    bool operator()(const arc&, const arc&) const
    {
        std::cout<<"arc vs arc"; 
        return true;
    }
    bool operator()(const line&, const arc&) const
    {
        std::cout<<"line vs arc"; 
        return true;
    }
    bool operator()(const arc& a, const line& l) const
        { return this->operator()(l, a); }
    
    bool operator()(const arc&, const item&) const
    {
        std::cout<<"arc vs arc"; 
        return true;
    }
    bool operator()(const item&, const arc&) const
    {
        std::cout<<"item vs arc"; 
        return true;
    }
 
    template<class t>
    bool operator()(const item&, const t&) const
    {
        std::cout<<"item vs t"; 
        return true;
    }
 
    template<class t1, class t2>
    bool operator()(const t1&, const t2&) const
        {
          std::cout << "t1 vs t2"; 
          return true;
        }
};
 
bool intersect(const element& e1, const element& e2)
{
    return std::visit(intersects_algo(), e1, e2);
}
 
int main()
{
    const element e1 = line {};
    const element e2 = arc  {};
    const element e3 = item {};
    
    const bool r1 = intersect(e1, e2); std::cout << ": " << r1 << '\n';
    const bool r2 = intersect(e3, e2); std::cout << ": " << r2 << '\n';
    const bool r3 = intersect(e3, e1); std::cout << ": " << r3 << '\n';
}
output:
Code
1
2
3
line vs arc: 1
item vs arc: 1
item vs t: 1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2022, 22:47
Помогаю со студенческими работами здесь

Int number = 2; Console.WriteLine(++number - number-- * ++number); Выводит -6; Как ?
Знающие, объясните, пожалуйста. Каким чудом тут получается -6 ? O_o int number = 2; Console.WriteLine(++number - number-- *...

Input type=number
Как сделать чтобы стрелки, которые показываются принаведении на инпут и при фокусе, всегда отображались и никогда не прятались?

Реализация иерархии классов на основе класса "Грузоперевозчик"
Помогите, пожалуйста!!!!Четвёртый день сижу над этой задачей и ничего не получается. Создать базовый класс «Грузоперевозчик» и...

Отправить POST type number а не text
Ребята у меня есть форма с отправкой постом инпутов- http.send(&quot;vorFF=&quot; + f.vorFF.value + &quot;&amp;commFF=&quot; + f.commFF.value +...

Type error: must be real number, not method
Здравствуйте, подскажите пожалуйста что неправильно в коде. import random import math A= while True: i=int(input('vvedite...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru