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