【发布时间】:2017-10-16 16:40:13
【问题描述】:
是否可以在类中创建非静态模板字段?
如果没有,如何解决?
此类字段应在编译时根据需要创建。
示例
我有很多B-class,比如B1,B2,B3。
(实际上,它们有更有意义的名字。)
我想创建一个类D,它具有非静态模板函数add<BX>(),每次我调用它时都必须counter++,对于每个人BX,对于一个D 的某个实例。
(在实际情况下,它做了更复杂的事情。)
这是一个有效的demo 来实现它。
可悲的是,我目前必须在D 中逐个(B1、B2、B3)对每个BX 进行硬编码:-
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 是静态的,我知道该怎么做,但对于非静态来说,这似乎是不可能的。
【问题讨论】:
标签: c++ templates c++14 non-static template-variables