int d[S];
constexpr v(int ii)
{
S = ii; // ???
}
};
У вас вообще не шаблон написан. template <typename T> и хотя б cppref почитайте, а лучше Шаблоны Джосаттиса
да Вы что? прямо таки не шаблон?https://en.cppreference.com/w/cpp/language/template_parameters non-type template parameter type
У меня шаблон написан. Вы сами читали? А если читали, почему ответить не можете на вопрос? А если не можете, то зачем читать?
Он уже задан при инстанцировании
а как мне его задать в конструкторе ? Я хочу потом делать вот так: v(5); или v = 5;
Можете пасту оттуда сделать? я что-то всё равно не вижу шаблонов, у которых <> содержит явный тип, когда речь не о шаблоне с частичной/полной специализацией (есть общий <typename T>, мы специализируем его как int). С тем, что не-шаблон, я не прав, тк при специализации уходит typename. Однако особенности интерпретации подсказывают, что автор выше не о специализациях говорил.
Как и в обычном конструкторе, если вам правда нужна специализация. MyConstr(T t) : data(t) {}
std::array<int, 5> - стандартный пример non-type template parameter. Не стоит путать новичков
Сами напишите и проверьте. Сппреф уже в стиле С++20 написал struct B<auto n> .
У автора таки не auto
А зачем вам тогда параметр есть вы его принимаете через конструкторы?
Я хочу сделать my_string s = "123"; где в my_string строка хранится в стеке: template <int N> class my_string { char s[N]; my_string(char *); } такое можно сделать на этом языке ? если да, то как?
Просто вырежьте темплейт примите const char* и скопируйте его в буффер длинны строки
Но я хочу чтобы длина строки (размер моей структуры) определялась на этапе компиляции.
Всё правильно. Это - нешаблонный конструктор шаблонного класса. Тут НЕТ шаблона, нечему задавать параметр.
Нельзя такое сделать. Класс не может определять класс памяти, в которой сохраняются его данные, КРОМЕ возможности часть данных размещать в динамической памяти.
Это должен быть тогда параметр шаблона.
Ты должен был сказать, что стека не существует 🙂
ну можно через преколы использовать просто std::array<char,S> =)
можно std::array<char, 3> a1{ "sd" }; но он даже здесь не понимает размер строки конструктора, и просит явно указать размер ((((
Посмотрите в сторону string_view там примерно реализовано что вы хотите
так string_view не хранит же в себе ничего, кроме указателя на строку и её размер. а я хочу чтобы строка внутри класса хранилась (как в std::array)
тогда чтобы хранить в экземплярах нужно копировать или как в св делать указатель
а зачем если не секрет? хотите чтоб длина строки отразилась в sizeof ?
или перемещать через конструкторы перемещения
нужно копировать. а размер строки (и соответственно структуры) мы узнаем только в момент копирования
Std::bitset<N> ещё
хочу выделениями памяти не пользоваться, они очень медленные у меня
чтобы хранить, нужно выделять
#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 и выделяйте хоть в буфере на стеке
Error[Pe441]: argument list for class template "MyStr" is missing
какой у вас стандарт стоит в флагах компилятора?
у меня g++-11 -std=c++17 нормально
тк используй обычный стринг с кастомным аллокатором
тк конечно, C++17 появилось вывод типа неявно
ну либо ставить C++17 либо писать string<S> s = "14";
а нет, C ++17 у меня! IAR Embedded Workbench For ARM v8.30
а какой компилятор?
у этой среды свой собственный компилятор, IAR C/C++
ну тогда просто компилятор скорее всего старый и не реализует данную фичу мб
причем аллокатор можешь даже сам написать, ничего сложного
Ага) ничего сложного
Тогда ручками MyStr<6> s = "Hello";
да выдели буффер, смещай указатель, перегрузи allocate )
Ну да, осталось понять что там со всякими мелочами типа многопоточности и фрагментации
Напиши макрос который сам будет к твоему типу во время компиляции писать размер) тоже вариант
Я особо макросы не умею писать, но вот) 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"); }
Можно обойтись make_string функцией, чтобы не городить макросы. После С++17 CTAD сработает
да, тоже варик) C++ такой многоходовочный)
тогда у make_string тоже надо будет писать размер, не?
Нет, сработает автовывод размера из литерала (если принимать ссылку, конечно)
Так возвращаемый тип тоже нуждается в параметре
template <size_t N> MyStr<N> make_str(const char(&arr)[N]);
Ну так если размер у функции его неявно можно написать даже без CTAD?
make_str("123") сработает без CTAD
поставил свежую версию компилятора. Заработало! Компилирует. Спасибо всем!
Обсуждают сегодня