【发布时间】: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