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

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

int d[S];

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

62 ответов

23 просмотра

У вас вообще не шаблон написан. 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";

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта