如果没有,如何解决?
应根据需要在编译时创建此类字段.
例
我有很多B级,比如B1,B2,B3.
(在实际情况中,他们有更有意义的名字.)
我想创建一个具有非静态模板函数的类D,添加< BX>(),每次调用它时,对于每个单独的BX,对于D的某个实例,必须计数.
(在实际情况中,它会使某些事情变得更复杂.)
这是一个工作demo来实现它.
可悲的是,我目前必须在D中逐个硬编码每个BX,一个接一个(B1,B3): –
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的每个实例都有自己的计数器: –
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是静态的,我知道怎么做,但对于非静态,它似乎是不可能的.
解决方法 使用std :: map std :: unordered_map(来自Yakk的建议;感谢)索引和RTTI?#include <map>#include <iostream>#include <typeindex>class B1 {};class B2 {};class B3 {};class D { private: std::unordered_map<std::type_index,std::size_t> bxMap; public: template <typename BX> voID add () { ++ bxMap[std::type_index(typeID(BX))]; } template <typename BX> int get () { return bxMap[std::type_index(typeID(BX))]; } };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 return 0; }总结
以上是内存溢出为你收集整理的c – 非静态模板成员:可能吗?全部内容,希望文章能够帮你解决c – 非静态模板成员:可能吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)