16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510

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

30.03.2024, 16:40. Показов 4460. Ответов 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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
04.04.2024, 15:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ballantrae Посмотреть сообщение
У меня опыта пока немного, но тем не менее, я не видел указателей с размером больше или меньше 4 байт на 32х разрядной системе и 8 байт на х64.
Так речь не о размере типа указателя.
Указатель кроме хранения адреса ещё и имеет размер типа, на который он указывает.
Что позволяет производить над ним арифметические операции.
Например :
C++
1
2
3
4
5
6
char ch[2];
Student st[2];
auto ch_ptr = ch;
auto st_ptr = st;
++ch_ptr;
++st_ptr;
++ch_ptr - адресс изменится на sizeof(ch)
++st_ptr - адресс изменится на sizeof(str)
Очевидно же, что указатель - это не просто адресс памяти.
2
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
04.04.2024, 17:07  [ТС]
Цитата Сообщение от Ballantrae Посмотреть сообщение
У меня опыта пока немного, но тем не менее, я не видел указателей с размером больше или меньше 4 байт на 32х разрядной системе и 8 байт на х64.
я кстати тоже, собственно поэтому и мысль возникла - что указатель он - этож указатель, он одинаковый должен быть.
на то он и указатель.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
04.04.2024, 17:59
Цитата Сообщение от Ballantrae Посмотреть сообщение
У меня опыта пока немного, но тем не менее, я не видел указателей с размером больше или меньше 4 байт на 32х разрядной системе и 8 байт на х64.
Опыт здесь ни при чем. В реальных реализациях все указатели обычно одинаковы.

Однако с точки зрения языка С++ это не более чем совпадение. Еще раз: с точки зрения языка С++ все указатели имеют (могут иметь) разную природу, в том числе и разную величину. Компилятор языка С++ следует правилам языка С++. Ему не интересно, что там вам говорит ваш опыт, каким бы он ни был.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.04.2024, 18:53
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Еще раз: с точки зрения языка С++ все указатели имеют (могут иметь) разную природу, в том числе и разную величину.
Ссылку предоставь пожалуйста.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
04.04.2024, 22:30  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Очевидно же, что указатель - это не просто адресс памяти.
вот , да , понятное объяснение.
логичное.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
05.04.2024, 14:13
Цитата Сообщение от pup_kin Посмотреть сообщение
ведь как я понял указатель то имеет одинаковую природу и величину - какая разница на что указывать
Молодец, правильно понял. Но есть нюансы.

Цитата Сообщение от pup_kin Посмотреть сообщение
т.е хочу создать массив указателей на произвольные объекты
Нет. У тебя нет задачи создать, у тебя есть задача хранить это и где-то далее использовать. Вот ты создал это:
C++
1
void* vs[] = {x, y, z, ...};
ты затёр типы, а далее использовать это не можешь - толку от создания 0. Если хочется разные типы, тебе нужен tuple. Массив - это элементы одного типа.

Добавлено через 3 минуты
Цитата Сообщение от pup_kin Посмотреть сообщение
т.е. верно понимаю - щаблоны функций обрабатывает компилятор и создает под каждый тип новую функцию если надо
Верно.

Добавлено через 12 минут
Цитата Сообщение от Ballantrae Посмотреть сообщение
У меня опыта пока немного, но тем не менее, я не видел указателей с размером больше или меньше 4 байт на 32х разрядной системе и 8 байт на х64.
И не увидишь. Там "адинесник" больше понимает в теме, чем эксперты. Единственное чем в данном контексте "отличаются" указатели - тип. Но это тип не указателя, а данных на которые он указывает. К самим указателям это отношения не имеет.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.04.2024, 14:25
Цитата Сообщение от mashmed135 Посмотреть сообщение
И не увидишь.
Увидишь.
Есть ещё указатели на функции и функции-члены класса.
На их размеры погляди.
C++
1
2
3
4
5
6
7
#include <iostream>
struct A{
    int mwthod(int, int);
};
int main(){
    std::cout << sizeof(&A::mwthod);
}
Возможный вариант : 16
Тем не менее, это указатель.

Хотя я согласен, что в контексте, мы обсуждали указатели именно на данные.
Но что-то мне кажется что TheCalligrapher, не спроста завел разговор о возможно разной "величине" (хоть я сразу и не понял что это о размере) указателей.

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от mashmed135 Посмотреть сообщение
Там "адинесник" больше понимает в теме, чем эксперты.
Насмешили ))

0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
05.04.2024, 14:30
Цитата Сообщение от SmallEvil Посмотреть сообщение
Есть ещё указатели на функции и функции-члены класса.
Оправдания мимо. Нигде в контексте не было "функции-члены класса". А если этого не было в контексте, а далее откуда-то появилось - значит это попытка оправдываться и подменять тему.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Хотя я согласен, что в контексте, мы обсуждали указатели именно на данные.
А, ну вот, ты даже сам это заметил. Молодец.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но что-то мне кажется что TheCalligrapher, не спроста завел разговор о возможно разной "величине" (хоть я сразу и не понял что это о размере) указателей.
Ну это нужно показать. А казаться может что угодно.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.04.2024, 14:45
Цитата Сообщение от mashmed135 Посмотреть сообщение
Оправдания мимо.
Я и не оправдываюсь совсем. Что за нелепая чушь ?
Это то что касается непосредственно указателей.
Цитата Сообщение от mashmed135 Посмотреть сообщение
Нигде в контексте не было "функции-члены класса".
Так же нигде и не было указано про лишь указатели на объекты встроенных типов.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
05.04.2024, 14:58
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я и не оправдываюсь совсем. Что за нелепая чушь ?
Если это не оправдания, значит ты сразу учёл этот момент в рассуждениях. А если ты его учёл сразу - ты написал бы про mem ptr также сразу. А если написал только когда появились вопросы - значит сначала сделал выводы, и только потом начал искать для этих выводов основания - это и есть оправдания.

К тому же, при таком подходе:
Цитата Сообщение от pup_kin Посмотреть сообщение
for (int i = 0; i < 2; i++) {
  arr[i].setTimeout(02);
}
складывать ptr и mem ptr вместе не имеет смысла, поскольку синтаксис отличается и из подобного всё равно ничего не получится.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Так же нигде и не было указано про лишь указатели на объекты встроенных типов.
Никакие встроенные типы к делу отношения не имеют. Вопрос был в контексте указателей на объекты. Встроенных они типов или нет - к теме не относится.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.04.2024, 15:40
Цитата Сообщение от mashmed135 Посмотреть сообщение
Ну это нужно показать.
Не всё вертится вокруг x86 архитектуры.
Например :
Цитата Сообщение от stackoverflow
Another example: take an 8051program. It has three memory ranges and thus has three different pointer sizes, from 8 bit, 16 bit, 24 bit, depending on where the target is located, even though the target's size is always the same (e.g., char).
Счас польется новый поток пены XD

Добавлено через 4 минуты
Цитата Сообщение от mashmed135 Посмотреть сообщение
А если ты его учёл сразу - ты написал бы про mem ptr также сразу.
Писать обо всём сразу, о чём нужно и не нужно - это даром терять время.
Есть уточняющие вопросы ? - Будут ответы. (если я их знаю)
Хотя судя по вам, вам ничего не нужно кроме срача.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
05.04.2024, 16:04  [ТС]
Цитата Сообщение от mashmed135 Посмотреть сообщение
У тебя нет задачи создать, у тебя есть задача хранить это и где-то далее использовать.
да четко.
но все таки и создать тоже задача есть,
если например помещать туда тип через тип

массив указателй на разные типы
и помещать в него *тип1, *тип2, *тип1 , *тип2
размер типов я знаю.
итерацию же смогу реализовать?

образно(сейчас такой задач не стоит, просто пофилософствовать)
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
05.04.2024, 16:28
Цитата Сообщение от SmallEvil Посмотреть сообщение
Не всё вертится вокруг x86 архитектуры.
Снова манипуляция - это не является свойством x86, это является свойством любой живой архитектуры.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Another example: take an 8051program. It has three memory ranges and thus has three different pointer sizes, from 8 bit, 16 bit, 24 bit, depending on where the target is located, even though the target's size is always the same (e.g., char).
Похоже, ничего дучше не нагуглилось, но это совсем позор. В си коде все указатели будут так же одинакового размера, потому как иначе не будет возможности этот указатель передать в другую(потенциально далеко расположенную) область кода.

То же самое есть/было в том же x86 - как там это называется, "короткие переходы"? Я не помню. Влияет ли наличие подобного на размер указателя на функцию? Нет.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Писать обо всём сразу, о чём нужно и не нужно - это даром терять время.
Есть уточняющие вопросы ? - Будут ответы. (если я их знаю)
Здесь нечего уточнять, контекст вполне чётко определён ещё в оп. К тому же, никто не говорил про "писать обо всём сразу" - здесь опять манипуляции. Если есть простейший контрпример, достаточно написать только его.

И да, как забавно проигнорирована часть моего поста. Совершенно случайно это именно та часть, которая максимально чётко показывает бессмысленность любых рассуждений про "ptr vs mem ptr". Почему? Потому что ответов нет и не будет.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Счас польется новый поток пены XD
Цитата Сообщение от SmallEvil Посмотреть сообщение
Хотя судя по вам, вам ничего не нужно кроме срача.
Совсем не палиться. Провоцирует срач и обвиняет в этом оппонента. Достойно. Ладно, похоже это кто-то, кого я "зацепил" в прошлые разы и теперь он просто агрится/мстит. С подобными персонажами говорить смысла нет.

Добавлено через 2 минуты
Цитата Сообщение от pup_kin Посмотреть сообщение
массив указателй на разные типы
Ну это в целом не возможно, как я уже писал. Бери tuple - туда можешь засунуть какие угодно типы. Итерацию конечно так просто как с массивом не сделать, но ничего невыполнимого там нет.

Добавлено через 3 минуты
Хотя, если ты пришёл из скриптухи, то возможно тебе на первых порах больше подойдёт std::variant[] = {}, а далее уже цикл по массиву и std::visit(или хотя бы std::get_if). Таким же образом работает вся скриптуха с динамической типизацией.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
05.04.2024, 17:06
Цитата Сообщение от _stanislav Посмотреть сообщение
Ссылку предоставь пожалуйста.
Ссылку на что именно?

Сколько раз уже здесь втолковывали эти азы?

1. Два разных типа в С++ имеют совершенно разные представления, если требования стандарт языка не оговаривает иного.
2. Стандарт языка С++ оговаривает общие черты представления некоторых целых типов (к нашей теме не относится)
3. Стандарт языка С++ оговаривает общие черты представления указателей на layout-compatible типы.
4. Стандарт языка С++ оговаривает общие черты представления указателей char * и void *.

Это всё. (Аналогичные гарантии есть в языке С)

То есть за редким исключением, все указательные типы в С++ ничего общего друга с другом не имеют. Все они имеют совершенно разные размеры и совершенно разные внутренние представления.
2
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
05.04.2024, 18:48  [ТС]
ну вообще не совсем понятно
указатель - он указывает на адрес в памяти
адресации в памяти очевидно подобна.
операторы ++ -- и иные которые определены наверное где-то,
они безусловно должны учитывать размер объекта,
но если мы возъмем и сохраним где-то реальный размер объекта
и будем хранить только начало его, то мы же сможем переписать оператор ++
или как -то сэмулировать его работу.


т.е. зная начало и размер, мы же можем прочитать данные и интерпретировать их.

чисто теоретически.
а кстати как это можно сделать?
т.е. например в одном массиве указатели на начала объектов, а в другом размеры объектов( условно положим что у каждого класса размеры разные)
и обходя элементы первого массива в цикле
анализируем размер по второму
и например пребразовываем указатель к указателю на другой тип ?


можно ли менять тип указателя или создавать новый другого типа, но указывающий на то же место в памяти что и указатель первого типа?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.04.2024, 19:22
Цитата Сообщение от pup_kin Посмотреть сообщение
можно ли менять тип указателя или создавать новый другого типа, но указывающий на то же место в памяти что и указатель первого типа?
Можно, при определенных случаях. (если нужно могу привести цитату из стандарта)

Цитата Сообщение от pup_kin Посмотреть сообщение
т.е. зная начало и размер, мы же можем прочитать данные и интерпретировать их.
чисто теоретически.
а кстати как это можно сделать?
Этого делать не нужно. Указатели могут быть реализованы как угодно.
Применяя какую то одну из реализаций, ваш код будет работать только под определенный компилятор.

Простыми словами, вы маетесь фигней.
Даже Асемблер вам не буду советовать, там тоже нужно со всем считаться, а не писать код на догадках и своем, личном, восприятии.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
05.04.2024, 22:02  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Простыми словами, вы маетесь фигней.
это понятно.
задача решена, и остальное уже просто так измышления.

про стандарты с++ почитал.
Возник вопрос:
новые стандарты языка и использование новых возможностей оно увеличивает размер исполняемого файла, библиотеки по сравнению с реализацией аналогичного предыдущим стандартом?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.04.2024, 22:27
Цитата Сообщение от pup_kin Посмотреть сообщение
новые стандарты языка и использование новых возможностей оно увеличивает размер исполняемого файла, библиотеки по сравнению с реализацией аналогичного предыдущим стандартом?
Это от вас зависит, а не от стандарта. Как напишете, так и будет.

Если будете писать код без понимания, то и разработка для вас будет сложна, и результат будет полон сюрпризов. Язык - это инструмент, как молоток, умеете им пользоваться - получается хорошо, не умеете - получается плохо. И не важно какого года выпуска этот молоток.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.04.2024, 22:29
Цитата Сообщение от pup_kin Посмотреть сообщение
новые стандарты языка и использование новых возможностей оно увеличивает размер исполняемого файла, библиотеки по сравнению с реализацией аналогичного предыдущим стандартом?
ХЗ. Я вот выше С++17 пока не трогаю.
Всё зависит не от самого стандарта, а от используемых средств.

Например использование STL + BOOST скажем в libtorrent.
Там это серьезно сказывается на размере исполняемого файла, но и используются не пару феничек.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.04.2024, 22:59
Цитата Сообщение от pup_kin Посмотреть сообщение
т.е. зная начало и размер, мы же можем прочитать данные и интерпретировать их.
чисто теоретически.
а кстати как это можно сделать?
Для этого используется указатель на char, или указатель на std::byte.
Используя такой указатель можно "просматривать" память, занимаемую объектом другого типа. Также с их использованием можно реализовать свою адресную арифметику.
Например, итерироваться по массиву вы можете так:
C++
1
2
3
4
5
int arr[10] = {};
 
int* p = arr;
 
p += 1; // *p == arr[1]
или так:
C++
1
2
3
4
5
int arr[10] = {};
 
char* p = reinterpret_cast<char*>(arr);
 
p += sizeof(int); // *reinterpret_cast<int*>(p) == arr[1]
Только помните, что помимо размера, вы также должны учитывать требования выравнивания к "интерпретируемым" данным.

Если же предположить, что у нас есть область памяти, где лежат объекты разных типов друг за другом, то да, вполне можно сделать некий "индекс", который будет правильно их оттуда извлекать, получив таким образом "как бы" массив из разных типов. Предстоит решить вопрос типизации при таком извлечении, учесть вопросы выравнивания и производительности в целом такого контейнера. Но задача не нерешаемая.

В целом пока выглядит так, что полет вашей фантазии опережает ваши реальные знания, поэтому и ответы в этой теме в большинстве случаев вам не понятны. Как по мне, лучше не спешить, и подучиться, а потом вернуться к теме "интерпретации разных данных в памяти".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2024, 22:59

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru