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

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

30.03.2024, 16:40. Показов 4371. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,722
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
08.04.2024, 23:22
Цитата Сообщение от SmallEvil Посмотреть сообщение
не, ну можно свои типы напридумывать ))
Можно, только как именно ему их делать? Методики кто ТСу объяснит? Проще всего их посмотреть в реальном коде и ужаснуться понять сколько всего нужно учесть, чтобы код при этом остался корректным.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.04.2024, 23:24  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Во-первых библиотека не стороння, а стандартная.
я прост не упомянул,
в ардуино нет stl.
есть какие -то решения на эту тему, но они достаточно корявы и проще самому написать.
собственно об этом и речь
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
Ответ Создать тему
Новые блоги и статьи
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru