Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Новые правила выведения шаблонного типа в c++17

#cpp #шаблоны_с++ #cpp17


Что дают новые правила выведения шаблонного типа в c++17?
    


Ответы

Ответ 1



В c++17 появилась возможность опускать явное упоминание типов шаблонных параметров при объявлении переменной шаблонного типа. Например, для шаблонного типа S, конструктор которого принимает аргумент, зависимый от T: template struct 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]

Комментариев нет:

Отправить комментарий