#cpp #шаблоны_с++ #cpp17
Что дают новые правила выведения шаблонного типа в c++17?
Ответы
Ответ 1
В c++17 появилась возможность опускать явное упоминание типов шаблонных параметров при объявлении переменной шаблонного типа. Например, для шаблонного типа S, конструктор которого принимает аргумент, зависимый от T: templatestruct S { S(const T&) {} }; можно использовать упрощённую запись, вида: S si(42); S sl(42l); S sd(42.); На первый взгляд кажется, что все переменные si, sl, sd имеют одинаковый тип. И если бы S не был шаблонным типом, это было бы действительно так. Но в данном случае, реальные типы переменных различны и выводятся из типа аргумента, переданного в конструктор. Эквивалентная запись для прежнего стандарта языка будет выглядеть так: S si(42); S sl(42l); S sd(42.); Правда, указывая явно тип в треугольных скобках, нет особого смысла использовать разные типы в аргументах, т.е. можно везде использовать целое 42. Упомянутая выше логика компилятора опирается на неявное выведение типов (Implicit Deduction Guides). Но помимо этого есть и явное (Explicit Deduction Guides). В этом случае можно указать компилятору явно использовать некоторый целевой тип при попытке выведения типа. Например, если после определения шаблона класса добавить такую строку: S(double) -> S ; то это заставит компилятор выбирать тип int в качестве T, когда аргумент конструктора имеет тип double. Т.е. в этом случае, запись вида: S sd(42.); будет уже создавать переменную типа S , а не S . Объект типа S по-прежнему можно будет создать, но тип придётся указывать явно. О правилах выведения типов можно получить дополнительную информацию в черновике стандарта: [temp.deduct.guide] [over.match.class.deduct]
Комментариев нет:
Отправить комментарий