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

Народ, кто-нибудь знает планируют ли в С++26 разрешить CTAD для

параметров (ну и заодно для возврата) ?
Это позволит объявлять функцию как void someFunc(std::vector vec) а потом вызывать как someFunc({1,2,3}) или someFunc({1.1, 1.2, 1.3})
То есть фича сама по себе очень важная и удобная
Но помимо этого я тут понял где это может еще пригодиться - например для эмуляции именованных параметров когда тип неизвестен. Сейчас именованные параметры можно эмулировать используя отдельную структурку и инициализируя ее через designated-initializers
struct DrawRectParams { int left; int top; int width; int height; }
void drawRect(DrawRectParams args){
...
}
int main(){
drawRect({.left = 40, .top = 50, .width = 100, .height = 200});
}
Но что делать если тип неивестен (должен выводиться из типа аргумента)? Сразу появляется идея сделать эту структурку шаблонной
template<typename T1, T2>
struct DrawRectParams {
T1 left;
T2 top;
}
void drawRect(DrawRectParams args){
..
}
то тогда вызов как
drawRect({.top = 10, .left = 20})
drawRect({.top = 10.5, .left = 20.5});
мог бы работать но это не работает (даже если добавить deduction guids) - вся проблема в том что CTAD разрешен только при объявлении локальных переменных а для параметров запрещен

Что думаете насчет этой фичи? Кстати, есть ли уже такой пропозал? Какой шанс что эту фичу добавят в С++26?

7 ответов

25 просмотров

ну CTAD там было бы неправильно, ломает/усложняет правила перегрузки, а это точно никому не надо. Вместо этого я предлагал добавить значение ... void someFunc(std::vector<...> vec); И это бы создавало шаблон с параметрами, по типу как делает это auto

Стикер

1. пора бы уже догадаться, что ваши идеи настолько уникальны, что никто кроме вас такого пропозала не напишет. 2. шансы примерно равны нулю

из-за чего отказались от этого? Я думаю из-за того что у auto уже безумное число значений и тут противоречие вообще

А где почитать обсуждение про отказ от std::vector<auto>?

Богдан- Автор вопроса
Kelbon
ну CTAD там было бы неправильно, ломает/усложняет ...

мне пока непонятно какие правила перегрузки там ломаются и зачем нужно выдумывать новый синтаксис и почему нельзя просто расширить уже знакомый CTAD до вывода типов в параметрах. Просто когда видишь как CTAD работает с локальными переменными std::tuple tup = {1, "2"}; то сразу же логически появляется мысль что это должно работать при выводе типа возврата std::tuple someFunc(){ return {1, "2"}; } и в параметрах void someFunc(std::tuple tup); someFunc({1, "2"}) и как раз таки запрет на такой вывод параметров и возврата создает некую ассиметрию

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Кто может подсказать? Я преобрпзовал изображение в бинарное(у меня установлен трекбар который при установленном значении меняет пиксели на белый если меньше и чёрный если боль...
Константин VS
6
Карта сайта