【问题标题】:non default constructible parameters within lambdas in fold expressions折叠表达式中的 lambda 中的非默认可构造参数
【发布时间】:2021-04-15 19:25:00
【问题描述】:

我正在尝试查看是否可以使用在 lambda 中不可默认构造的参数作为折叠表达式的一部分。如果T 是默认可构造的,则以下代码有效。

template <typename ...T>
struct X
{
   void foo()
   {
    ([](const T&)
    {
       if (sizeof(T) < 4)
       {
          std::cout << "Small block size: " << sizeof(T) << std::endl;
       }
    }(T{}), ...);

    // Print sizes
    ((std::cout << sizeof(T) << std::endl), ...);
   }
};

struct A {
   int a[100];
   };
struct B
{
};

int main()
{
   X<A,B> x;
   x.foo();
}

输出

Small block size: 1
400
1

【问题讨论】:

  • 为什么你认为 fold 或 lambda 对T 有要求?需要默认构造的部分显然是“T{}”。
  • 我不确定您在这里寻找什么。如果T 不是默认构造,则不能默认构造一。因此,您不能通过基于这种类型的模板参数推导来调用函数。此处 lambda 的唯一方式是 C++20 之前的版本,您不能使用未推导的模板参数。即使是 C++20 后的版本,调用它仍然很尴尬。
  • 让 lambda 以 sizeof(T) 作为参数。或T* 并通过nullptr。因为值实际上并不重要。

标签: c++ templates lambda c++17 fold-expression


【解决方案1】:

lambda 不需要参数:

([]{
    if (sizeof(T) < 4)
    {
       std::cout << "Small block size: " << sizeof(T) << std::endl;
    }
}(), ...);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 2012-12-24
  • 2021-02-04
  • 1970-01-01
  • 2015-08-31
  • 2010-12-10
  • 2016-05-18
  • 2013-05-24
相关资源
最近更新 更多