在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;
}
哪些输出:33.33.7
使用模板编写相同的代码:
template<class X1, class X2> auto sum1(const X1& x1, const X2& x2)
{
return x1 + x2;
}
看起来更复杂。这是否意味着 lambda 可以替换函数模板?
嗯...
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)一个有效的替代方案是泛型λ(也来自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)泛型lambda可以(大致)替换函数模板,但是从C++20开始,lambda函数本身可以(可能)是模板,语法如下
[]<typename X1, typename X2>(X1 const & x1, X2 const &x2){ return x1+x2) }
auto sum(const auto& x1, const auto& x2)
不是lambda。它实际上是一个缩写的函数模板,应该可以回答您的问题。它不会取代函数模板:它是一回事,只是使用速记。
您的第一个代码不是lambda函数。
而且你不能说 lambda 可以取代模板函数
您可以使用lambda编写函数定义,并且可以在代码中的任何位置定义它,如果您确定只会使用它一次,我们通常会使用它。
顺便说一句,auto不是能够使用多个数据类型的好方法,它可能会导致一些问题,并且不适用于所有c ++版本。