gpt4 book ai didi

c++ - 使用模板参数推导将 lambda 存储为成员

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:18 24 4
gpt4 key购买 nike

以前,当 C++11 可用时,我尝试使用 auto 说明符和成员初始值设定项将 lambda 存储为类字段。这是一次不成功的尝试:

struct Y
{
auto x = [] { ; };
};

错误:

error: non-static data member declared with placeholder 'auto'

尽管 lambda 的大小(不失去一般性,带有捕获)在定义类成员时是已知的,但不允许使用 auto 说明符。为什么?没有太明确的限制。

现在template argument deduction for class templates在 GCC 7.0.0 主干中可用。我试着再做一次:

template< typename F >
struct X
: F
{
using F::operator ();
X(F && f) : F(static_cast< F && >(f)) { ; }
};

struct Y
{
X x = [] { ; };
};

但是我得到一个错误:

error: invalid use of template-name 'X' without an argument list

我怀疑,实现是部分的,甚至可能不一致。它是否允许我实现所需的 w/o 类型删除(和内存的动态分配)?

允许非成员(member)自由定义:

X x = [] { ; };

附加:

人们问我试图解决什么问题?我需要为类内定义的仿函数提供简洁的语法。

如果我可以写(以下代码有效):

struct point_of_parabaloid // aggregate
{
double x, y;
double z = [&] { return x * x + y * y; }();
};

point_of_parabaloid p = {1.0, 2.0};
assert(p.z == 5.0);

为什么我不能定义类内 lambda(例如,用于 z 的惰性计算)?

我不需要捕获一些异常的东西,只是一个类成员(或 this),如 point_of_parabaloid 定义。

最佳答案

如果 lambda 事先已知,您可以使用 decltype 解决它:

auto lambda = [](){};

struct C {
decltype(lambda) member = lambda;
};

不是很漂亮,但它确实有效。

我认为如果将您的模板技术重写为:

自动 x = X([](){});

但是,gcc-7(快照)也不接受。我怀疑这是因为它仍在进行中。

[刚刚用基于 20161014 构建的 g++ 7 trunk 再次测试,然后上面的工作]

您可以使用 maker 函数解决它

template <typename L>
struct X {
L member;
};

template <typename T>
auto make_x(T t) { return X<T>{t}; }

auto x = make_x([](){});

关于c++ - 使用模板参数推导将 lambda 存储为成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40099376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com