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) }