初始化存储 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::f’ 是一个静态数据成员;它只能在定义时初始化

该赋值也是不允许的,因为删除了赋值 操作员。如果我在第 (3) 行之后添加以下内容

A<decltype(f1)>::f = f1

报如下错误

错误:使用已删除函数'main(int,char**)::& main(int,char**)::::operator=(const 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); // ... } f1f2 存储一次。

而您存储 k 时间 10.000f1 和每个 f2 两次。

使用起来可能不太方便。通常在不同类型的优化(内存/速度)本身、安全性和可读性/简单性之间进行权衡。