является ли тип T генерик-контейнером my_array<some_type>,и если является,то внутри if создать переменную типа some_type?
Я пробовала проверять с помощью is_same,но не знаю как это сделать для типов с генерик-значениями и как потом это самое генерик значение вытащить
А что значит "генерик контейнер"?
И что хочешь делать, если тип - не генерик контейнер
Тогда else и ошибка
template <typename T> class MyArray
Так это конкретный класс (семейство)
А почему контейнер должен быть generic? Почему, условно, std::vector<int> вам подходит, а struct int_vector : std::vector<int> {}; нет? Это избыточное требование
Если ты не можешь написать какое-то ограничение в шаблоне, в конце концов, ты можешь не реализовыватт его вообще
Эээ,ну потому что в функцию могут подаваться контейнеры с разными генерик-типами
В этом шаблоне есть несколько разных if'ов по типу T который в него передали if constexpr(std::is_same<T,bool>::value) { ... } else if constexpr(std::is_same<T, TString*>::value) { ... }
Чем решение с is same не устраивает?
Я не знаю как использовать is same с типом имеющим темплейтный аргумент и как потом этот темплейтный аргумент достать чтобы создать переменную с таким типом 😕
Полагаю, вы пытаетесь сказать, что туда могут передаваться разные контейнеры. А у разных контейнеров разные типы элементов. Для выяснения типа элемента контейнера можно использовать T::value_type, а лучше — std::ranges::range_value_t<T>
Но просто "подтип" у контейнера может быть любой std::is_same<T, MyArray<????> >::value Не знаю даже как написать это
Вы хотите принимать только MyArray?
Кстати, тоже вариант
Ну да,в моем контейнере есть ValueType который я сделала через using ValueType = T; Просто я не знала как написать вызов is_same чтобы он пропустил MyArray<????>
Ну,сама функция принимает не только MyArray вот,там разные типы могут быть как T
Можно сделать второй тайпнейм и сранивать из_сейм<T1,T2>
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>) ...
Или более универсальный вариант: if (is_specialization_of_v<T, MyArray>) Реализация is_specialization_of_v здесь
Огооо,спасибо большое,сейчас посмотрю
Но я полагаю, вы что-то очень некрасивое пишите, если у вас внутри одной функции настолько разнообразные ветки исполнения, я бы посоветовал писать перегрузки функций
Да,там очень много некрасивого потому что это С++ враппер к СAPI Луа ☠️
Я к тому, что 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) { ... }
https://m.youtube.com/watch?v=7fd9q7FKXbA
А можно как-то проверить если ни одна перегрузка не сработала??
А,ну и вот хотела еще узнать,если подается не сам контейнер,а указатель на него,можно ли как-то "разыменовать тип" чтобы проверить в is_same?
Можно написать такую перегрузку: template<typename T> void foo(T arg) { ... } Она сработает, если ничего более подходящего нет. Правда, список разумных вещей, которые можно сделать внутри такой функции обычно крайне мал
std::remove_pointer_t<T> Да и вообще полезно ознакомиться с <type_traits>
Ой,спасибо огромное,оба ответа и то что нужно!
Обсуждают сегодня