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