170 похожих чатов

Как в конструкторе задать параметр шаблона ? template <int S> struct v {

int d[S];

constexpr v(int ii)
{
S = ii; // ???
}
};

62 ответов

14 просмотров

У вас вообще не шаблон написан. template <typename T> и хотя б cppref почитайте, а лучше Шаблоны Джосаттиса

Blue Talpa
У вас вообще не шаблон написан. template <typena...

да Вы что? прямо таки не шаблон?https://en.cppreference.com/w/cpp/language/template_parameters non-type template parameter type

Артём-Хафизов Автор вопроса
Blue Talpa
У вас вообще не шаблон написан. template <typena...

У меня шаблон написан. Вы сами читали? А если читали, почему ответить не можете на вопрос? А если не можете, то зачем читать?

Он уже задан при инстанцировании

Артём-Хафизов Автор вопроса
Anatoly Shirokov
Он уже задан при инстанцировании

а как мне его задать в конструкторе ? Я хочу потом делать вот так: v(5); или v = 5;

Сергей
да Вы что? прямо таки не шаблон?https://en.cpprefe...

Можете пасту оттуда сделать? я что-то всё равно не вижу шаблонов, у которых <> содержит явный тип, когда речь не о шаблоне с частичной/полной специализацией (есть общий <typename T>, мы специализируем его как int). С тем, что не-шаблон, я не прав, тк при специализации уходит typename. Однако особенности интерпретации подсказывают, что автор выше не о специализациях говорил.

Артём Хафизов
У меня шаблон написан. Вы сами читали? А если чита...

Как и в обычном конструкторе, если вам правда нужна специализация. MyConstr(T t) : data(t) {}

Blue Talpa
Можете пасту оттуда сделать? я что-то всё равно не...

std::array<int, 5> - стандартный пример non-type template parameter. Не стоит путать новичков

Blue Talpa
Можете пасту оттуда сделать? я что-то всё равно не...

Сами напишите и проверьте. Сппреф уже в стиле С++20 написал struct B<auto n> .

Артём Хафизов
а как мне его задать в конструкторе ? Я хочу потом...

А зачем вам тогда параметр есть вы его принимаете через конструкторы?

Артём-Хафизов Автор вопроса
'Егор 'Зорин
А зачем вам тогда параметр есть вы его принимаете ...

Я хочу сделать my_string s = "123"; где в my_string строка хранится в стеке: template <int N> class my_string { char s[N]; my_string(char *); } такое можно сделать на этом языке ? если да, то как?

Артём Хафизов
Я хочу сделать my_string s = "123"; где в my_str...

Просто вырежьте темплейт примите const char* и скопируйте его в буффер длинны строки

Артём-Хафизов Автор вопроса
'Егор 'Зорин
Просто вырежьте темплейт примите const char* и ско...

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

Всё правильно. Это - нешаблонный конструктор шаблонного класса. Тут НЕТ шаблона, нечему задавать параметр.

Артём Хафизов
Я хочу сделать my_string s = "123"; где в my_str...

Нельзя такое сделать. Класс не может определять класс памяти, в которой сохраняются его данные, КРОМЕ возможности часть данных размещать в динамической памяти.

Ilya Zviagin
Нельзя такое сделать. Класс не может определять кл...

Ты должен был сказать, что стека не существует 🙂

Артём Хафизов
Но я хочу чтобы длина строки (размер моей структур...

ну можно через преколы использовать просто std::array<char,S> =)

Артём-Хафизов Автор вопроса
'Егор 'Зорин
ну можно через преколы использовать просто std::ar...

можно std::array<char, 3> a1{ "sd" }; но он даже здесь не понимает размер строки конструктора, и просит явно указать размер ((((

Артём Хафизов
можно std::array<char, 3> a1{ "sd" }; но он даже...

Посмотрите в сторону string_view там примерно реализовано что вы хотите

Артём-Хафизов Автор вопроса
'Егор 'Зорин
Посмотрите в сторону string_view там примерно реал...

так string_view не хранит же в себе ничего, кроме указателя на строку и её размер. а я хочу чтобы строка внутри класса хранилась (как в std::array)

Артём Хафизов
так string_view не хранит же в себе ничего, кроме ...

тогда чтобы хранить в экземплярах нужно копировать или как в св делать указатель

Артём Хафизов
так string_view не хранит же в себе ничего, кроме ...

а зачем если не секрет? хотите чтоб длина строки отразилась в sizeof ?

Артём Хафизов
так string_view не хранит же в себе ничего, кроме ...

или перемещать через конструкторы перемещения

Артём-Хафизов Автор вопроса
'Егор 'Зорин
тогда чтобы хранить в экземплярах нужно копировать...

нужно копировать. а размер строки (и соответственно структуры) мы узнаем только в момент копирования

Blue Talpa
Принято.

Std::bitset<N> ещё

Артём-Хафизов Автор вопроса
Ramil Rizvanov
а зачем если не секрет? хотите чтоб длина строки о...

хочу выделениями памяти не пользоваться, они очень медленные у меня

Артём Хафизов
Но я хочу чтобы длина строки (размер моей структур...

#include <iostream> template <size_t N> struct MyStr { char s[N]; MyStr(const char (&str)[N]) { std::copy(std::begin(str), std::end(str), std::begin(s)); } }; int main() { MyStr s = "Hello"; std::cout << "size = " << sizeof(s) << "\n"; std::cout << s.s << "\n"; return 0; }

Артём-Хафизов Автор вопроса
'Егор 'Зорин
чтобы хранить, нужно выделять

в стеке не нужно, там быстро выделяется

Артём Хафизов
в стеке не нужно, там быстро выделяется

Перегрузите New и выделяйте хоть в буфере на стеке

Артём-Хафизов Автор вопроса
Alexandr Rudalev
#include <iostream> template <size_t N> struct My...

Error[Pe441]: argument list for class template "MyStr" is missing

Артём Хафизов
Error[Pe441]: argument list for class template "My...

какой у вас стандарт стоит в флагах компилятора?

Артём Хафизов
хочу выделениями памяти не пользоваться, они очень...

тк используй обычный стринг с кастомным аллокатором

Alexandr Rudalev
у меня g++-11 -std=c++17 нормально

тк конечно, C++17 появилось вывод типа неявно

Артём Хафизов
Error[Pe441]: argument list for class template "My...

ну либо ставить C++17 либо писать string<S> s = "14";

Артём-Хафизов Автор вопроса
Артём Хафизов
С++11

а нет, C ++17 у меня! IAR Embedded Workbench For ARM v8.30

Артём-Хафизов Автор вопроса
'Егор 'Зорин
а какой компилятор?

у этой среды свой собственный компилятор, IAR C/C++

Артём Хафизов
у этой среды свой собственный компилятор, IAR C/C+...

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

Ramil Rizvanov
тк используй обычный стринг с кастомным аллокаторо...

причем аллокатор можешь даже сам написать, ничего сложного

Артём Хафизов
С++11

Тогда ручками MyStr<6> s = "Hello";

Denis P
Ага) ничего сложного

да выдели буффер, смещай указатель, перегрузи allocate )

Ramil Rizvanov
да выдели буффер, смещай указатель, перегрузи allo...

Ну да, осталось понять что там со всякими мелочами типа многопоточности и фрагментации

Артём Хафизов
С++11

Напиши макрос который сам будет к твоему типу во время компиляции писать размер) тоже вариант

Артём Хафизов
С++11

Я особо макросы не умею писать, но вот) template< std::size_t size> struct MegaString { char s[size]; MegaString(const char (&str)[size]) { std::copy(std::begin(str), std::end(str), std::begin(s)); } }; #define SIZE_STRING_(String) sizeof(String) #define CONSTRUCT_STRING(TypeString, NameString, String) \ TypeString<SIZE_STRING_(String)> NameString = String; int main() { CONSTRUCT_STRING(MegaString, s, "123"); }

'Егор 'Зорин
Я особо макросы не умею писать, но вот) template<...

Можно обойтись make_string функцией, чтобы не городить макросы. После С++17 CTAD сработает

Alexander Karaev
Можно обойтись make_string функцией, чтобы не горо...

тогда у make_string тоже надо будет писать размер, не?

'Егор 'Зорин
тогда у make_string тоже надо будет писать размер,...

Нет, сработает автовывод размера из литерала (если принимать ссылку, конечно)

Alexander Karaev
Нет, сработает автовывод размера из литерала (если...

Так возвращаемый тип тоже нуждается в параметре

Alexander Karaev
template <size_t N> MyStr<N> make_str(const char(&...

Ну так если размер у функции его неявно можно написать даже без CTAD?

Артём-Хафизов Автор вопроса
Alexandr Rudalev
Тогда ручками MyStr<6> s = "Hello";

поставил свежую версию компилятора. Заработало! Компилирует. Спасибо всем!

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
@ahndmn @ayaw0_0 здарова, на чем пишете?
Aiwan \ (•◡•) / _bot
7
Коллеги, как получить PId для собственного процесса из под линукса?
Роман Лях (rgreat)
6
Карта сайта