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

jav*_*ver 3 c++ templates non-static c++14 template-variables

是否可以在类中创建非静态模板字段?
如果没有,如何解决?

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

我有很多的B-class一样B1,B2,B3.
(在实际情况中,他们有更有意义的名字.)

我想创建一个类D非静态模板函数add<BX>()是必须counter++每次我称呼它,每一个人的时间BX,对于D的特定情况下
(在现实情况下,它确实有些事情更复杂.)

这是一个实现它的工作演示.
可悲的是,我现在有硬编码每一个BX,一个接一个(B1,B2,B3内部)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;}
};
Run Code Online (Sandbox Code Playgroud)

这是用法.请注意,每个实例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;
}
Run Code Online (Sandbox Code Playgroud)

我的梦想是: -

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; //???
    }
};
Run Code Online (Sandbox Code Playgroud)

我知道如果countBX是静态的,怎么做,但对于非静态,它似乎是不可能的.

Leo*_*rdo 10

你不需要RTTI解决这个问题,也不需要解决这个问题std::map(特别是RTTI).变量模板和继承可以为您解决此问题:

class B1 {}; class B2 {}; class B3 {};

template<typename T>
class Counter {
  public:
    int counter = 0;
};

template<class... BXs>
class D : public Counter<BXs>... {
  public:
    template<typename B>
    void add() {
      Counter<B>::counter++;
    }

    template<typename B>
    int get() {
      return Counter<B>::counter;
    }
};
Run Code Online (Sandbox Code Playgroud)

这与你真正想要的非常接近(顺便说一句,你是在正确的轨道上).