我定义了一个 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?
为了节省空间,您可能会重新设计为:
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
time f1
,f2
并且每个k
s 两次。
使用起来可能不太方便。通常在不同类型的优化(内存/速度)本身、安全性和可读性/简单性之间进行权衡。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句