Рассмотрим следующий код:Член-Function-Scoped Переменная
#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
без необходимости перемещать объявление и инициализацию некоторых пор , далекие заголовки и конструкторы?
Причина, по которой я хочу это, состоит в том, что значение этой переменной относится только к этой конкретной функции (но также относится к экземпляру, чья функция-член), например, параметры последнего вызова, время последнего вызова и т. Д.
Класс, который стоит за этой идеей, уже несколько велик и распространяется декларация, а инициализация таких крошечных переменных, которые используются в рамках одной функции, становится уродливой.
Обновление: Обратите внимание, что я не хочу утечки памяти. Когда экземпляр уничтожен, связанные с ним переменные также должны быть удалены.
Обновление2: Очевидно, что в этой точной семантике нет надлежащей языковой функции. Хотя есть некоторые обходные пути, каждый из них вводит ограничения и недостатки, когда дело доходит до
- размещения «функция» декларации и определения
- обращающихся другие «реальные» переменных членов
- перегрузки «функции» в производном классе
- ...
с помощью этих последствий в виду, что это только представляется наиболее эффективным придерживаться первое, что приходит на ум:
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++; }
};
или аналогичный.
Огромное спасибо за ваши комментарии и ответы!
так вам нужна статическая переменная, специфичная для экземпляра? Разве это не нарушает цель «статического» в том случае, если она используется внутри класса/структуры? –
@TonyTheLion Но этот 'static' не используется внутри класса, он используется внутри функции. – Angew
Нет, вы не можете этого сделать, вы должны сделать его членом класса. Полная остановка. – syam