Функция шаблона: есть ли синтаксис для принятия любого типа аргумента, как 'auto' делает для лямбд? - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь написать функцию, принимающую сложный аргумент.Допустим, это может быть класс или шаблон класса.Код внутри функции одинаков для всех аргументов, и мне не нужно нигде ссылаться на тип аргумента.Итак, я хочу написать что-то вроде этого:

auto func(auto& someComplicatedClassInstance) {
   return someComplicatedClassInstance.someMemberFunc();
}

Я не могу просто написать template <typename T>, потому что он не будет работать, если T сам шаблон, а auto аргумент функции не являетсявещь в C ++.Делать func лямбду единственным способом?Кажется странным, что такая же функция компилятора была бы включена для лямбда-выражений, но не для обычных функций.И в моем конкретном случае я пишу перегрузку для operator<<, поэтому я не могу сделать это лямбда-выражением.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Использование auto в лямбда-списке параметров аналогично использованию параметра шаблона.Это просто сокращенная запись (отчасти потому, что до C ++ 20 вы не можете объявлять лямбды с обычными параметрами шаблона в противном случае).Когда компилятор генерирует функтор для лямбды, перегрузка operator() получает параметр шаблона для каждого параметра auto.

Так что для не лямбда-функций вы должны записать его в длинном формате.

0 голосов
/ 14 октября 2018

Вы можете использовать шаблон функции:

template <typename T>
auto func(T&& someComplicatedClassInstance) {
   return std::forward<T>(someComplicatedClassInstance).someMemberFunc();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...