Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510

Массив шаблонов

30.03.2024, 16:40. Показов 4473. Ответов 79
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
я адинесник прошу не пинать
захотелось как и в адинес добавлять в массив любые типы

возникает вопрос
можно ли создать или объявить как то массив [] с фиксированной длиной при инициализации указав все элементы
но скажем так массив указателей на разные типы.
ведь как я понял указатель то имеет одинаковую природу и величину - какая разница на что указывать.
т.е хочу создать массив указателей на произвольные объекты,

т.е. аналогично шаблон функции

C++
1
2
3
4
5
template <typename T,typename STR>void printSettings(T t1, STR &str){
  if(Serial){
    Serial.println(String(str) + String(t1.getTimeout())); 
  }
}
а тут я взял запихал указатели в массив и обрабатываю массив как хочу хочу гет таймаут дергаю, хочу настройки всем меняю одинаково.

можно ли создать такое
типа
auto arr[2] ={&s1, $s2};

Добавлено через 2 минуты
неожиданно получилось вот так
C++
1
template<typename T> T arr[2] = { &Serial, &ss };
как еще моно реализовать ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2024, 16:40
Ответы с готовыми решениями:

Разреженный массив (с использованием шаблонов), исключение оператора посредством SFINAE
Доброго времени суток. не так давно начал изучать плюсы, и если с функциональным программированием все более-менее понятно, то шаблоны...

Массив шаблонов или как обратиться к элементам разного типа, хранящиеся в одном "списке" по индексу
Собственно, вот такой вот вопрос. Очень нужно решение. Спасибо.

Использование шаблонов
Здравствуйте, пытаюсь набросать элементарный пример шаблона в Visual Studio 12 и получаю ошибку компилятора: error LNK2001:...

79
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
07.04.2024, 10:30
Студворк — интернет-сервис помощи студентам
TheCalligrapher, то есть с точки зрения языка указатель это абстракция и в общем случае у этой абстракции нет свойства размер?
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.04.2024, 11:22
_stanislav, здесь есть примеры: https://stackoverflow.com/a/66102654

Добавлено через 25 минут
_stanislav, кстати вот здесь еще было обсуждение: double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарво

Добавлено через 2 минуты
Вот еще полезная ссылка для расширения кругозора: https://stackoverflow.com/ques... care-about
2
 Аватар для Annemesski
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
08.04.2024, 11:52
Цитата Сообщение от DrOffset Посмотреть сообщение
Как по мне, лучше не спешить, и подучиться, а потом вернуться к теме "интерпретации разных данных в памяти".
pup_kin, для точки отсчета предлагаю Вам разобрать несколько отдаленный от темы топика пример, но на мой скромный взгляд неплохо приоткрывающий форточку:
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 <cstdlib>
#include <iostream>
#include <cstdint>
 
int ** create2Dplane_array(size_t rows, size_t cols)
{
    int **ret = reinterpret_cast<int **>(malloc(rows * sizeof (int *) + rows * cols * sizeof (int)));
    int *ptr = reinterpret_cast<int *>(ret + rows);
    for (size_t row = 0; row < rows; ++row) {
        ret[row] = ptr + row * cols;
    }
 
    return ret;
}
    
void init2Dplane_array(int **arr, size_t rows, size_t cols)
{
    int val = 0;
    for (size_t row = 0; row < rows; ++row) {
        for (size_t col = 0; col < cols; ++ col) {
            arr[row][col] = ++val;
        }
    }
}
 
void print2Dplane_array(int **arr, size_t rows, size_t cols) {
    for (size_t row = 0; row < rows; ++row) {
        for (size_t col = 0; col < cols; ++ col) {
            std::cout << arr[row][col] << " ";
        }
        std::cout << std::endl;
    }
}
 
void free2Dplane_array(int **arr) {
    free(arr);
}
 
int main()
{
    size_t rows = 7;
    size_t cols = 15;
 
    int **arr = create2Dplane_array(rows, cols);
    init2Dplane_array(arr, rows, cols);
    print2Dplane_array(arr, rows, cols);
    free2Dplane_array(arr);
 
    return 0;
}
Здесь двумерный массив организован таким образом, что выделенная под него память разделена на две части - в первой части хранятся указатели на начала строк массива, а во второй значения. То есть в одной области памяти хранятся разнородные данные, два массива: массив указателей и массив чисел:
Code
1
2
3
4
5
6
7
     ____________
    /            \
   /           |  V
[| | | | | | |] [| | | | | | | | | | |]
    ^          |            ^
    |__ массив              |____массив
        указателей               данных
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.04.2024, 18:55  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
для точки отсчета предлагаю Вам разобрать несколько отдаленный от темы топика пример, но на мой скромный взгляд неплохо приоткрывающий форточку:
это прям код в стиле 1С
простыни из итераций.
на мой взгляд достаточно сложный для понимания пример с reinterpret_cast.
двумерные массивы и так занятная штука, как по мне.

а вопрос разве если мы просто сделаем
free (arr), где arr = int**arr - утечек памяти не образуется?
нужно же отработать в цикле все указатели на вложенные массивы
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.04.2024, 19:05
Цитата Сообщение от pup_kin Посмотреть сообщение
это прям код в стиле 1С
вообще ни разу
Цитата Сообщение от pup_kin Посмотреть сообщение
сложный для понимания пример с reinterpret_cast
Это лишь для определенности. Можно использовать Си-сстайл приведения типов :
(int **)
Я сомневаюсь что в 1С есть указатели... Хотя предмет не изучил, знаю лишь что это скриптовый ЯП а значит никаких указателей там не может быть, в априори.
Вам действительно стоит посмотреть на ЯП пайтон.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 20:23
Цитата Сообщение от pup_kin Посмотреть сообщение
а вопрос разве если мы просто сделаем
free (arr), где arr = int**arr - утечек памяти не образуется?
нужно же отработать в цикле все указатели на вложенные массивы
Он всю память разобрал из одного единого куска (даже картинку вам нарисовал, заморочился). Поэтому нет, не нужно.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.04.2024, 20:29
DrOffset, тема из разряда :
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.04.2024, 22:39  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я сомневаюсь что в 1С есть указатели... Хотя предмет не изучил, знаю лишь что это скриптовый ЯП а значит никаких указателей там не может быть, в априори.
указателей там нет - это верно, есть только ссылки, но я имел ввиду в целом многоцикличность - Толстовость оборотов , когда писал , что на 1С похоже


C++
1
2
3
4
5
6
7
8
9
// выделяется большой объем памяти включающий в себя всё
int **ret = reinterpret_cast<int **>(malloc(rows * sizeof (int *) + rows * cols * sizeof (int)));
 
// это сдвигается от начала в область данных
    int *ptr = reinterpret_cast<int *>(ret + rows);
// и тут заполнение указателей на строки
    for (size_t row = 0; row < rows; ++row) {
        ret[row] = ptr + row * cols;
    }
а как это связано с произвольными типами.
вот совершенно верно
я тоже так и думал
есть некие данные непрервынй кусок

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

что из них что я не знаю, но я знаю что читаются они слева направо, и например 5 элемент это указатель на класс Serial
его объем я тоже знаю 40 байт,
без проблем читаю 40 байт
C++
1
Serial1 = readBytes(poiner1, sizeof(Serial));
далее есть указатель на 75 байте и он типа SoftwareSerial
C++
1
SS_2 = read(poiner2, sizeof(SoftwareSerial));
я еще больше запутался.

почему нельзя сохранить указатели на объекты разных типов например в массив шаблонов и потом их просто прочитать.

к примеру передаю я по радио каналу структуру , или класс, я же так и передаю её

C++
1
nrf.write(DataPointer, sizeof(MyStruct));
к примеру первой посылкой я передаю размер сообщения, второй посылкой по этому размеру читаю объект.

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

Добавлено через 10 минут
т.е. получается можно
привести указатели на разные объекты к вообще любому типу с помощью
C++
1
2
reinterpret_cast 
//Позволяет преобразовывать любой указатель в указатель любого другого типа. Также позволяет преобразовывать любой //целочисленный тип в любой тип указателя и наоборот.

и собственно создать массив таких переделанных указателей из разных типов, но переделать их например в int*
и жить себе не тужить?

сейчас попробую.
если это сработает - то спасибо,ларчик -то просто открывался
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 22:44
Цитата Сообщение от pup_kin Посмотреть сообщение
и собственно создать массив таких переделанных указателей из разных типов, но переделать их например в int*
Не, так нельзя. Даже если оно сделает вид, что заработает.
Нельзя игнорировать требования выравнивания к разным типам.
Нельзя игнорировать понятие времени жизни объекта. Не любой объект можно вот так запросто представить сырой памятью.

Цитата Сообщение от pup_kin Посмотреть сообщение
reinterpret_cast
Это в ваших руках будет как взведенная граната.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.04.2024, 22:45
pup_kin, перестаньтье писать длинные посты ни о чем, что не кассается темы.
Нет конечно, ваш пример ни очем.
Все можно привести к void*, ах да не все. Ну это же вам неведомо.
А потом вернуть назад тип вы уже не сможете, или нужно передавт список типов, что и делается с помощью stdLLtuple
Теперь идем дальше, по вашему, что вы можете типы чередовать и тд и тп, нет не сможете, вам также придется передавать метаинформацию.
Ну вобщем у вас беда с восприятием строготипизированного ЯП
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 22:49
Цитата Сообщение от pup_kin Посмотреть сообщение
почему нельзя сохранить указатели на объекты разных типов например в массив шаблонов
Выше по теме приводили в пример std::tuple. Это как раз оно.
Еще приводили std::variant - это тоже оно, но с другого краю.

Хотите свое такое и чтобы было правильно? Надо изучить как оно там реализовано внутри, и поймете если, значит и свое сможете сделать. В противном случае это просто будет хождение по граблям.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.04.2024, 22:59  [ТС]
конечно же
объект - это сущность динамическая, зачастую.
просто к примеру у меня есть рабочий код
по радиообмену.
на модулях NRF2401 и любых других аналогичных.

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

НО иногда, как я понял - можно

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
std::tuple.
Цитата Сообщение от DrOffset Посмотреть сообщение
std::variant
это оно, да,
но хочется просто работать с байтами не завязываясь на сторонние библиотеки.

спасибо огромное Annemeski за то, что напомнили о приведении типов.

мухи указатели отдельно , данные/данные отдельно.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 23:07
Цитата Сообщение от pup_kin Посмотреть сообщение
но хочется просто работать с байтами не завязываясь на сторонние библиотеки.
Во-первых библиотека не стороння, а стандартная.
Во-вторых, я вам предложил изучить их внутреннее устройство, чтобы не ходить по граблям, а не юзать их непосредственно. Пожалуйста читайте внимательнее.
В третьих вы все-таки бежите впереди паровоза. Можете бежать и дальше, я не отговариваю, но просто помните: все, что вы сейчас наваяете, будет неверно процентов на 98 (даже если оно будет работать)
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.04.2024, 23:16
DrOffset, не, ну можно свои типы напридумывать ))
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 23:22
Цитата Сообщение от SmallEvil Посмотреть сообщение
не, ну можно свои типы напридумывать ))
Можно, только как именно ему их делать? Методики кто ТСу объяснит? Проще всего их посмотреть в реальном коде и ужаснуться понять сколько всего нужно учесть, чтобы код при этом остался корректным.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.04.2024, 23:24  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Во-первых библиотека не стороння, а стандартная.
я прост не упомянул,
в ардуино нет stl.
есть какие -то решения на эту тему, но они достаточно корявы и проще самому написать.
собственно об этом и речь
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 23:27
Цитата Сообщение от pup_kin Посмотреть сообщение
я прост не упомянул,
в ардуино нет stl.
Я знаю. Но там есть компилятор C++, который подерживает шаблоны, а упомянутые tuple и variant - это в основном шаблонная магия. Так что будете знать как они работают - сможете написать свое похожее.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.04.2024, 23:29  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно, только как именно ему их делать? Методики кто ТСу объяснит?
собственно да,
делаю массив с размером загодя и в него загоняю все что нужно, и сам разбираю как уж смогу.
это примерно то что и нужно.
и достаточно объемлюще.
т.е. мне нужен кусок памяти от НАЧАЛА и до КОНЦА весь мой.что хочу туда то и пишу, сам занимаясь разметкой.
если кому плюсики забыл - кончились - завтра протыкаю
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.04.2024, 23:37
Цитата Сообщение от pup_kin Посмотреть сообщение
в ардуино нет stl
А зачем тогда хотелку раззевать ???
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.04.2024, 23:39
Цитата Сообщение от pup_kin Посмотреть сообщение
что хочу туда то и пишу, сам занимаясь разметкой.
...
Цитата Сообщение от DrOffset Посмотреть сообщение
Только помните, что помимо размера, вы также должны учитывать требования выравнивания к "интерпретируемым" данным.
Если это данные для записи куда-то (в порт, в сокет, в файл и т.д.) то они могу лежать друг за другом непрерывно.
Если с этими данными будет идти работа в памяти, то нужно обеспечить им верное выравнивание, либо читать каждый кусочек данных туда, где это это требование уже обеспечено.

Вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char buf[100];
 
char* p = buf;
int* pi = new(p) int(10); //неверно: у p некорректное выравнивание для int
// Note: сама по себе конструкция [new(...) тип] - это корректный способ создать объект в сырой памяти
// взамен некорректному *reinterpret_cast<int*>(p) = 10;
 
int a = 10;
memcpy(p, &a, sizeof(int)); // ok
 
int b = 0;
memcpy(&b, p, sizeof(int)); // ok
 
//можно обращаться к b
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2024, 23:39

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

С++ использование шаблонов
Приветствую всех на форуме. Написал код с использованием шаблонов. Задание звучит так : Задание. 1. Реализовать класс...

Реализация шаблонов
Всем привет! Можно ли как-то реализовывать шаблонный класс в другом файле? то есть имеем заголовочный файл там задаём сам шаблонный класс...

Функции-шаблонов
1.Нужно переделать в шаблоне input - набор символов не через a = rand() % 15; , а через ручной. Помогите, пожалуйста. #include...

Специализация шаблонов
Верните методу FindTopDocuments возможность быть вызванным со статусом документа вместо лямбды. Достаточно написать новый метод —...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru