Должны ли лямбды заменять шаблоны функций в C ++? - PullRequest
0 голосов
/ 07 января 2019

В C ++ я могу написать:

auto sum(const auto& x1, const auto& x2)
{
    return x1 + x2;
}

int main()
{
    cout << sum(1, 2) << endl;
    cout << sum(1, 2.3) << endl;
    cout << sum(1.4, 2.3) << endl;
}

Какие выходы: 3 3,3 3,7

Чтобы написать тот же код с шаблонами:

template<class X1, class X2> auto sum1(const X1& x1, const X2& x2)
{
    return x1 + x2;
}

выглядит сложнее. Означает ли это, что лямбды могут заменить шаблоны функций?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Uhmmm ...

1) на данный момент следующий код не является допустимым кодом C ++; возможно в будущем (C ++ 20?), но не до C ++ 17

auto sum(const auto& x1, const auto& x2)
{
    return x1 + x2;
}

2) это допустимый код (но только из C ++ 14) код вашего шаблона

template<class X1, class X2> auto sum1(const X1& x1, const X2& x2)  
{
    return x1 + x2;
}

3) допустимой альтернативой является generic-lambda (также из C ++ 14)

[](auto const & x1, auto const & x2){ return x1+x2; }

4) в C ++ 11 вы не можете просто использовать auto для типа возвращаемого значения, но вы должны явно указать его с конечным типом возвращаемого значения; например, с decltype() в следующем коде

template<class X1, class X2>
auto sum1 (X1 const & x1, X2 const & x2)
   -> decltype( x1+x2 )
{ return x1 + x2; }

или также без auto

template<class X1, class X2>
decltype( std::declval<X1 const>() + std::declval<X2 const>() )
      sum1 (X1 const & x1, X2 const & x2)
 { return x1 + x2; }

5) универсальная лямбда может (грубо) заменить шаблон функции, но, начиная с C ++ 20, лямбда-функция может (вероятно) сама шаблонная с синтаксисом следующим образом

[]<typename X1, typename X2>(X1 const & x1, X2 const &x2){ return x1+x2) }  
0 голосов
/ 07 января 2019

Ваш первый код не является лямбда-функцией.

и вы не можете сказать, что лямбда может заменить функции шаблона

Вы можете использовать лямбду, чтобы написать определение функции, и вы можете определить ее в любом месте вашего кода, мы обычно используем ее, если вы уверены, что будете использовать ее только один раз.

Кстати, auto - не очень хороший способ использовать более одного типа данных, он может вызвать некоторые проблемы и не работает со всеми версиями c ++.

0 голосов
/ 07 января 2019

auto sum(const auto& x1, const auto& x2) не лямбда. На самом деле это сокращенный шаблон функции , который должен ответить на ваш вопрос. Он не заменяет шаблоны функций: это то же самое, только с использованием сокращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...