考虑以下代码:
#include <iostream>
struct X {
int foo() {
// Can I get this to be an instance-specific static variable, please?
static int i = 0;
return i++;
}
};
int main() {
X a, b;
std::cout << a.foo() << ' ';
std::cout << b.foo() << ' ';
std::cout << b.foo() << '\n';
// output is: 0 1 2
// desired output: 0 0 1
}
i
是否可以为每个实例获取此静态变量的副本,X
而无需将声明和初始化移动到一些遥远的头文件和构造函数?
我想要这个的原因是因为这个变量的值只与这个特定的函数相关(但也特定于它的成员函数的实例),例如,最后一次调用参数、最后一次调用的时间等。
支持这个想法的类已经有点大了,并且在一个函数中使用的这种微小变量的声明和初始化变得越来越难看。
更新:请注意,我不想泄漏内存。当一个实例被销毁时,与之关联的变量也应该被删除。
更新²:显然(不幸的是)确实没有具有这种确切语义的适当语言功能。虽然有一些变通方法,但它们中的每一个都引入了限制和陷阱,当涉及到
- “函数”声明和定义的位置
- 访问其他“真实”成员变量
- 在派生类中重载“函数”
- ...
考虑到这些含义,坚持想到的第一件事似乎是最有效的:
struct A {
int j = 0;
int i = 0;
int foo() { return i++ + j++; }
};
而不是这样:
struct B {
int j = 0;
std::function<int()> foo =
[this, i = 0]() mutable { return i++ + this->j++; };
};
或这个:
struct C {
int j;
struct Foo {
int i;
C *c;
Foo(C *c) : i(), c(c) {}
int operator() () { return i++ + c->j++; }
} foo;
C() : j(), foo(this) {}
};
或这个:
struct D {
int j = 0;
std::map<std::string, int> i;
int foo() { return i[__PRETTY_FUNCTION__]++ + j++; }
};
或类似的。
非常感谢您的评论和回答!