-1

在 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;
}

看起来更复杂。这是否意味着 lambdas 可以替换函数模板?

4

3 回答 3

4

auto sum(const auto& x1, const auto& x2)不是 lambda。它实际上是一个缩写的函数模板,应该可以回答你的问题。它不会替换函数模板:它是相同的东西,只是使用简写。

于 2019-01-07T18:00:38.717 回答
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) 一个有效的替代方案是 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) generic-lambda 可以(大致)替换函数模板,但是,从 C++20 开始,lambda 函数本身可以(可能)是一个模板,其语法如下

[]<typename X1, typename X2>(X1 const & x1, X2 const &x2){ return x1+x2) }  
于 2019-01-07T18:03:55.973 回答
0

您的第一个代码不是 lambda 函数。

而且你不能说 lambda 可以替换模板函数

您可以使用 lambda 编写函数定义,并且可以在代码中的任何位置定义它,如果您确定只会使用一次,我们通常会使用它。

顺便说一句, auto 不是一种能够使用多个数据类型的好方法,它可能会导致一些问题并且不适用于所有 c++ 版本。

于 2019-01-07T18:11:45.507 回答