Хорошо известно, что переменные функции, функции или метода («функция-член») .Создание эффекта переменной метода static как для каждого экземпляра, так и для каждого экземпляра-экземпляра
(. Краткий обзор и проверка исправности)
В общем случае, это точно одна переменная:
int f() {
static int i = 0;
return i++;
}
То есть, есть одна переменная i
что created in .BSS/.DATA что «принадлежит» функции f
. Для шаблонов, это один за уникальный экземпляр:
template <typename T> int f() {
static int i = 0;
return i++;
}
int g() {
return f<int>() + f<int>() + f<int>() + f<float>();
}
Здесь есть два уникальные конкретизации (f<int>
и f<float>
), и таким образом, есть два i
s в сегменте .bss/.DATA.
Проблема
Я хочу, чтобы каким-то образом, чтобы переменные в функциях-членах шаблона живут как за экземпляр и за конкретизации их объемлющего класса. Я заинтересован в достижении этого ЭФФЕКТА, используя более или менее необходимые инструменты, необходимые (возможно, вообще не связанные со статикой). Как мне это сделать?
Например:
class Foo { public:
template <typename T> int f() {
static int i = 0;
return i++;
}
};
void g() {
Foo foo1;
Foo foo2;
/*
These will have values a=0, b=0, c=1. This happens because there are two
variables:
"Foo::f<float>()::i"
"Foo::f<double>()::i"
What I *want* is for there to be three variables:
"Foo::f<float>()::i" (foo1's copy)
"Foo::f<float>()::i" (foo2's copy)
"Foo::f<double>()::i" (foo1's copy)
So the result is a=0, b=0, c=0. How can I accomplish this effect (maybe
not using static)?
*/
int a = foo1.f<float>();
int b = foo1.f<double>();
int c = foo2.f<float>();
}
Может ли из downvoters пожалуйста дайте причина? Похоже на хорошо написанный вопрос, хотя, возможно, XY-проблема ... – ildjarn
Idk, почему здесь два близких голоса. Вопрос довольно ясен (хотя определенно трудно ответить). –