О как! Шаблонные typedef'ы на марше. К этому ещё надо привыкнуть...
U>C++17?
Для распространённого производного типа decay_t<T> можно было бы ввести и оператор, скажем, T~ (в суффиксной форме, чтобы не выбиваться из общего ряда)
Здравствуйте, Кодт, Вы писали:
К>Для распространённого производного типа decay_t<T> можно было бы ввести и оператор, скажем, T~ (в суффиксной форме, чтобы не выбиваться из общего ряда)
Здравствуйте, uzhas, Вы писали:
К>>Для распространённого производного типа decay_t<T> можно было бы ввести и оператор, скажем, T~ (в суффиксной форме, чтобы не выбиваться из общего ряда)
U>оператор над типом? не C++ — way =\
Что это не вей? Очень даже вей.
T* и T& — биективные, T const и T volatile — сюръективные, T&& — от контекста зависит (может трактоваться как обобщённая ссылка).
И паттерн-матчинг на них работает, невзирая на сюръективный характер cv-квалификаторов. (T const const = T const, т.е. обратное отображение инъективно).
Здравствуйте, Кодт, Вы писали:
К>Что это не вей? Очень даже вей. К>T* и T&
ах вот с какой колокольни надо смотреть, тут согласен, есть куда расширяться
К> — биективные, T const и T volatile — сюръективные, T&& — от контекста зависит (может трактоваться как обобщённая ссылка).
ну тут я вообще не смог убедиться в биективности\сюръективности\инъективности. как-то оно не сходится: снять ссылку или указатель не с любого типа можно и не все типы имеют const, к примеру.
к тому же у этих "операторов" разные области определения
К>И паттерн-матчинг на них работает
по крайне запутанным правилам
в целом, ты пытаешься натянуть строгую теорию на нестрогий и кривой C++. это заведомо провальный план =)
Здравствуйте, uncommon, Вы писали:
U>Такая маленькая функция. Что может быть проще? (по мотивам vimeo.com/97337253)
U> C++14:
интересно почему return type не auto???
Здравствуйте, uzhas, Вы писали:
К>> — биективные, T const и T volatile — сюръективные, T&& — от контекста зависит (может трактоваться как обобщённая ссылка). U>ну тут я вообще не смог убедиться в биективности\сюръективности\инъективности. как-то оно не сходится: снять ссылку или указатель не с любого типа можно и не все типы имеют const, к примеру. U>к тому же у этих "операторов" разные области определения
Согласен, нагнал лишнего с формализмами. Суть в том, что некоторые операции однозначно-обратимые, а другие нет.
Можно считать, что операция, обратная наложению указателя/ссылки, применительно к не-указателю/не-ссылке даёт тип "substitution failure"... а можно и не считать.
Глубоко в теорию типов никогда не втыкал, какой там формализм для этого предусмотрен, врать не буду.
Вот, а операция снятия константности применительно к неконстантному типу даёт (тот же) тип.
К>>И паттерн-матчинг на них работает U>по крайне запутанным правилам
Запутанность там связана лишь с тем, что у нас перемешаны алгебраические типы и типы, приводимые друг к другу несколькими разными способами.
Для начала, можно считать, что T~ это просто короткая запись для decay<T>::type
Следующим шагом — определить правило вывода, подобное T&&
— в списке параметров шаблона к T~ матчится только T, то есть, мы говорим "здесь должен быть уже очищенный тип, безо всяких этих ваших const-shmonst"
— в списке аргументов функции типы T, T&, T&&, T const, T const& матчатся к T~
— из всех их получается T
(Понятно, что в случае template typedef такой фокус в принципе невозможен, т.к. зависимые имена не выводятся)
U>в целом, ты пытаешься натянуть строгую теорию на нестрогий и кривой C++. это заведомо провальный план =)
План работает уже четвёртый десяток лет.
Ад хок, но это наш ад хок.