如何解决初始化存储 lambda 函数的 C++ 静态成员
我已经定义了一个结构体 A,其成员 f 包含一个 lambda 功能。类型作为模板参数给出,f 是 在构造函数中使用参数初始化 构造函数。以下代码运行良好。
template <typename f_t>
struct A {
f_t f; // (1)
int k;
A(f_t arg_f,int arg_k) : f(arg_f),k(arg_k) {} // (2)
int g(int x) { return f(f(x)) + k; }
};
现在我想要一个具有相同 lambda 函数的 struct A 向量。
int main() {
int p,q; std::cin >> p >> q;
auto f1 = [&](int x) -> int { return p * x + q; };
auto f2 = [&](int x) -> int { return p * x - q; };
std::vector<A<decltype(f1)>> vec_a1; // (3)
std::vector<A<decltype(f2)>> vec_a2;
for (int i = 0; i < 10000; i++) {
int k; std::cin >> k;
vec_a1.emplace_back(f1,k);
vec_a2.emplace_back(f2,k);
}
// ....
return 0;
}
有了这段代码,我认为struct A的成员f应该是 静态以节省空间。但是,如果我将第 (1) 行更改为:
static f_t f;
那么,自然就不能在构造函数中初始化了。 第 (2) 行产生以下错误:
error: ‘f_t A
该赋值也是不允许的,因为删除了赋值 操作员。如果我在第 (3) 行之后添加以下内容:
A<decltype(f1)>::f = f1
报如下错误:
错误:使用已删除的函数'main(int,char**)::
如何初始化成员 f?
解决方法
为了节省空间,您可以重新设计如下:
# get all images that start with localhost:32000,output the results into image_ls file
sudo microk8s ctr images ls name~='localhost:32000' | awk {'print $1'} > image_ls
# loop over file,remove each image
cat image_ls | while read line || [[ -n $line ]];
do
microk8s ctr images rm $line
done;
因此,您只将每个值 template <typename F>
struct A {
F f;
std::vector<int>* v;
A(F f,std::vector<int>* v) : f(f),v(v) {}
int g(int i,int x) { return f(f(x)) + v[i]; }
};
nt main() {
int p,q; std::cin >> p >> q;
auto f1 = [&](int x) -> int { return p * x + q; };
auto f2 = [&](int x) -> int { return p * x - q; };
std::vector<int> v;
for (int i = 0; i < 10'000; i++) {
int k; std::cin >> k;
v.emplace_back(k);
}
A<decltype(f1)> a1(f1,&v);
A<decltype(f2)> a2(f2,&v);
// ...
}
、f1
和 f2
存储一次。
而您存储 k
时间 10.000
、f1
和每个 f2
两次。
使用起来可能不太方便。通常在不同类型的优化(内存/速度)本身、安全性和可读性/简单性之间进行权衡。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。