Можно ли создать нестатическое поле шаблона в классе?
Если нет, как обойтись?
Такие поля следует создавать во время компиляции по мере необходимости.
Пример
У меня много B
-класса, например _2 _, _ 3 _, _ 4_.
(В действительности у них более значимые имена.)
Я хочу создать класс D
, который имеет нестатическую функцию шаблона add<BX>()
, которая должна counter++
каждый раз, когда я ее вызываю, для каждого отдельного BX
, для определенного экземпляра D.
(В действительности он делает что-то более сложное.)
Вот рабочая демонстрация для достижения этой цели.
К сожалению, в настоящее время мне приходится жестко кодировать каждый BX
, один за другим (_10 _, _ 11 _, _ 12_) внутри D
: -
class B1{};class B2{};class B3{};
class Counter{
public: int counter=0;
};
template<class BX>class Tag{};
class D{
Counter countB1;
Counter countB2;
Counter countB3;
public: template<class BX> void add(){
add_(Tag<BX>());
}
private:
void add_(Tag<B1>){ countB1.counter++;}
void add_(Tag<B2>){ countB2.counter++;}
void add_(Tag<B3>){ countB3.counter++;}
public: template<class BX> int get(){
return get_(Tag<BX>());
}
private:
int get_(Tag<B1>){ return countB1.counter;}
int get_(Tag<B2>){ return countB2.counter;}
int get_(Tag<B3>){ return countB3.counter;}
};
Вот использование. Обратите внимание, что каждый экземпляр D
сохраняет свой собственный counter
: -
int main() {
D d1;
d1.add<B2>(); d1.add<B2>(); d1.add<B3>();
std::cout<<d1.get<B1>()<<" "<<d1.get<B2>()<<" "<<d1.get<B3>()<<"\n";
//^ print 0 2 1
D d2;
d2.add<B1>();
std::cout<<d2.get<B1>()<<" "<<d2.get<B2>()<<" "<<d2.get<B3>()<<"\n";
//^ print 1 0 0 (not 1 2 1)
return 0;
}
Я мечтаю о чем-то вроде: -
class D{
Counter<BX> countBX; //???
public: template<class BX> void add(){
Counter<BX>::getNonStaticInstance(this).counter++; //???
}
public: template<class BX> int get(){
return Counter<BX>::getNonStaticInstance(this).counter; //???
}
};
Я знаю, как это сделать, если countBX
статичен, но для нестатических это кажется невозможным.