c – 非静态模板成员:可能吗?

c – 非静态模板成员:可能吗?,第1张

概述是否可以在类中创建非静态模板字段? 如果没有,如何解决? 应根据需要在编译时创建此类字段. 例 我有很多B级,比如B1,B2,B3. (在实际情况中,他们有更有意义的名字.) 我想创建一个具有非静态模板函数的类D,添加< BX>(),每次调用它时,对于每个单独的BX,对于D的某个实例,必须计数. (在实际情况中,它会使某些事情变得更复杂.) 这是一个工作demo来实现它. 可悲的是,我目前必须在D 是否可以在类中创建非静态模板字段?
如果没有,如何解决?

应根据需要在编译时创建此类字段.

我有很多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 – 非静态模板成员:可能吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1222107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存