【问题标题】:c++ generic lambdas: pattern type deductionc++ 泛型 lambdas:模式类型推导
【发布时间】:2018-10-30 02:15:46
【问题描述】:

在C++20中,在Familiar template syntax for generic lambdas提案下,以下代码正确推导出类型T:

auto lamTest = []<typename T>(std::initializer_list<T> const & l)
{
    std::vector<T> v{ l };
    for (auto && e : v)
        std::cout << e << " ";
};
lamTest( { 1,2,3 } );

C++17(或14)可以做这种模式推演吗?

注意:我专门询问 lambda 表达式。

【问题讨论】:

  • 好的,为什么要投反对票?
  • 我没有投反对票,但在我看来,这个问题并没有显示出任何研究成果,而且它显然没有用。
  • @cpplearner,实际上对此进行了相当多的研究,但一无所获。在 cppreference.com 和其他网站上查看。在我发布之后,我确实在上述引用的论文中找到了某种答案。但这对于似乎是一个常见问题的一个相当模糊的来源。事实上,这篇论文概述了它的普遍性。至于它不是很有用,如果你广泛使用泛型 lambda 并且没有访问权限或无法使用 C++20 编译器,它会非常有用。

标签: c++ lambda c++17 type-deduction c++20


【解决方案1】:

这是标准的函数模板推导。和这个没什么区别:

template<typename T>
auto lamTest(std::initializer_list<T> const & l)
{
    std::vector<T> v{ l };
    for (auto && e : v)
        std::cout << e << " ";
};

其中(std::initializer_list 除外)是常规 C++98 代码。

C++20 唯一添加的新功能是能够使用显式模板参数列表编写 lambda,而不是(或补充)C++14 的 auto。在其他方面,它的行为与任何其他模板函数一样。

【讨论】:

  • 那么我如何在 C++14 lambda 中推导出 T 呢?就是这个问题。
  • @ThomasMcLeod:没有T 可以推断,因为在 C++14 中不允许使用任意模板参数。这就是 C++20 添加该功能的原因。 演绎并不特殊;新功能是能够将您可以编写为常规函数的内容编写为 lambda。
  • 注:如果您使用auto 参数然后检查decltype(l)::value_type,您可以 获得T,但这显然意味着您不再受限于初始化列表,除非您还添加static_assert或其他一些检查
  • @hlt:您不能将auto 放在模板类型的中间,例如std::initializer_list&lt;T&gt;
  • 不在单个 C++17 lambda 中,不(你也可以使用 if constexpr,但是如果它不是 @987654333,你会怎么做@?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多