初始化存储 lambda 函数的 C++ 静态成员

田边13f

我定义了一个 struct 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) 行产生以下错误:

错误:'f_t A<f_t>::f' 是一个静态数据成员;它只能在定义时初始化

由于删除的赋值运算符,也不允许赋值。如果我在第 (3) 行之后添加以下内容:

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

报告以下错误:

错误:使用已删除的函数 'main(int, char**)::<lambda(int)>& main(int, char**)::<lambda(int)>::operator=(const main(int, char**)::<lambda(int)>&)'

(它似乎会导致链接器错误,但对于此错误。)

如何初始化成员 f?

杰洛德42

为了节省空间,您可能会重新设计为:

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.000time f1f2并且每个ks 两次。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用 lambda 初始化的 C++ 静态成员

Lambda(或函数)C ++内部的静态初始化

类C ++的静态函数成员中的静态数据成员的初始化顺序

C ++静态数据成员初始化

静态成员初始化程序的lambda范围

C#初始化以lambda为成员的结构

调用并初始化类的静态成员函数

用静态Fn函数初始化FnMut成员变量

静态存储联盟和命名成员的C语言初始化

在C ++中的自定义类的构造函数中初始化没有参数的静态const类成员

如何在运行时使用静态成员函数初始化静态成员变量?

c ++构造函数成员初始化:传递参数

C++ 构造函数中的成员初始化语法

从C中的函数初始化静态const变量

模板函数中的C ++静态变量初始化

C函数内部的静态变量初始化

C++模板类静态成员初始化

C ++静态结构类型成员初始化

Eigen中的C ++静态数据成员初始化错误

调用静态成员的方法以在C ++中进行初始化

在C ++中初始化静态字符串成员

在构造函数中使用输出参数函数初始化const成员的调用的代码比lambda简单

接受成员函数并向其返回静态lambda / std :: function的C ++函数

初始化后重新初始化C ++静态成员

具有非静态成员初始化程序的类的C ++ 11聚合初始化

是否可以在默认成员初始化程序中调用非静态成员函数?

静态类变量是否在首次调用静态成员函数之前初始化?

静态和非静态成员数据的初始化和构造函数的顺序

将 lambda 函数分配给静态成员变量 (c++)