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 ответов

40 просмотров

ну 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"}) и как раз таки запрет на такой вывод параметров и возврата создает некую ассиметрию

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

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

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
А, ты про текущую реализацию? Нет конечно, я бы сделал правильно - сейчас там гавнокод
Александр (Rouse_) Багель
6
Карта сайта