Lambda是否应替换C ++中的功能模板?

时间:2019-01-07 17:54:37

标签: c++ lambda function-templates c++20 generic-lambda

在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可以替换功能模板?

3 个答案:

答案 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 ++版本。