lambda 是否应该替换 C++ 中的函数模板



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

相关内容

  • 没有找到相关文章

最新更新