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

Доброе утро!Можете подсказать пожалуйста как в темплейтном методе можно узнать

является ли тип T генерик-контейнером my_array<some_type>,и если является,то внутри if создать переменную типа some_type?
Я пробовала проверять с помощью is_same,но не знаю как это сделать для типов с генерик-значениями и как потом это самое генерик значение вытащить

31 ответов

26 просмотров

А что значит "генерик контейнер"?

И что хочешь делать, если тип - не генерик контейнер

Alloca- Автор вопроса
Alloca
template <typename T> class MyArray

Так это конкретный класс (семейство)

Alloca
template <typename T> class MyArray

А почему контейнер должен быть generic? Почему, условно, std::vector<int> вам подходит, а struct int_vector : std::vector<int> {}; нет? Это избыточное требование

Если ты не можешь написать какое-то ограничение в шаблоне, в конце концов, ты можешь не реализовыватт его вообще

Alloca- Автор вопроса
Ofee Oficsu
А почему контейнер должен быть generic? Почему, ус...

Эээ,ну потому что в функцию могут подаваться контейнеры с разными генерик-типами

Alloca- Автор вопроса
Ilya Zviagin
Если ты не можешь написать какое-то ограничение в ...

В этом шаблоне есть несколько разных if'ов по типу T который в него передали if constexpr(std::is_same<T,bool>::value) { ... } else if constexpr(std::is_same<T, TString*>::value) { ... }

Alloca- Автор вопроса
Ilya Zviagin
Чем решение с is same не устраивает?

Я не знаю как использовать is same с типом имеющим темплейтный аргумент и как потом этот темплейтный аргумент достать чтобы создать переменную с таким типом 😕

Alloca
Эээ,ну потому что в функцию могут подаваться конте...

Полагаю, вы пытаетесь сказать, что туда могут передаваться разные контейнеры. А у разных контейнеров разные типы элементов. Для выяснения типа элемента контейнера можно использовать T::value_type, а лучше — std::ranges::range_value_t<T>

Alloca- Автор вопроса
Ilya Zviagin
У тебя есть T

Но просто "подтип" у контейнера может быть любой std::is_same<T, MyArray<????> >::value Не знаю даже как написать это

Alloca- Автор вопроса
Ofee Oficsu
Полагаю, вы пытаетесь сказать, что туда могут пере...

Ну да,в моем контейнере есть ValueType который я сделала через using ValueType = T; Просто я не знала как написать вызов is_same чтобы он пропустил MyArray<????>

Alloca- Автор вопроса
Ofee Oficsu
Вы хотите принимать только MyArray?

Ну,сама функция принимает не только MyArray вот,там разные типы могут быть как T

Yoru no ame 夜の雨
Кстати, тоже вариант

Можно сделать второй тайпнейм и сранивать из_сейм<T1,T2>

Alloca
Ну да,в моем контейнере есть ValueType который я с...

template<typename T> inline constexpr bool is_my_array = false; template<typename T> inline constexpr bool is_my_array<MyArray<T>> = true; // ... if (is_my_array<T>) ...

Ofee Oficsu
template<typename T> inline constexpr bool is_my_a...

Или более универсальный вариант: if (is_specialization_of_v<T, MyArray>) Реализация is_specialization_of_v здесь

Alloca- Автор вопроса
Ofee Oficsu
Или более универсальный вариант: if (is_specializa...

Огооо,спасибо большое,сейчас посмотрю

Alloca
Ну да,в моем контейнере есть ValueType который я с...

Но я полагаю, вы что-то очень некрасивое пишите, если у вас внутри одной функции настолько разнообразные ветки исполнения, я бы посоветовал писать перегрузки функций

Alloca- Автор вопроса
Ofee Oficsu
Но я полагаю, вы что-то очень некрасивое пишите, е...

Да,там очень много некрасивого потому что это С++ враппер к СAPI Луа ☠️

Alloca
Да,там очень много некрасивого потому что это С++ ...

Я к тому, что template<typename T> void foo(T arg) { if constexpr(std::is_same<T,bool>::value) { ... } else if constexpr(std::is_same<T, TString*>::value) { ... } else if constexpr(is_specialization_of_v<T, MyArray>) { ... } } смотрится ужасно в сравнении с void foo(bool arg) { ... } void foo(TString* arg) { ... } template<typename T> void foo(MyArray<T> arg) { ... }

Alloca- Автор вопроса
Ofee Oficsu
Я к тому, что template<typename T> void foo(T arg...

А можно как-то проверить если ни одна перегрузка не сработала??

Alloca- Автор вопроса
Ofee Oficsu
Я к тому, что template<typename T> void foo(T arg...

А,ну и вот хотела еще узнать,если подается не сам контейнер,а указатель на него,можно ли как-то "разыменовать тип" чтобы проверить в is_same?

Alloca
А можно как-то проверить если ни одна перегрузка н...

Можно написать такую перегрузку: template<typename T> void foo(T arg) { ... } Она сработает, если ничего более подходящего нет. Правда, список разумных вещей, которые можно сделать внутри такой функции обычно крайне мал

Alloca
А,ну и вот хотела еще узнать,если подается не сам ...

std::remove_pointer_t<T> Да и вообще полезно ознакомиться с <type_traits>

Alloca- Автор вопроса
Ofee Oficsu
std::remove_pointer_t<T> Да и вообще полезно озна...

Ой,спасибо огромное,оба ответа и то что нужно!

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта