将成员名称作为模板参数传递,由 T 的指针引用

passing name of member as template argument, referenced by pointer of T

如何将指针成员传递给模板参数?

很难解释,所以我将显示一个非常短的代码来指出问题。

这是一个有效的代码:-

template<class T, int T::*a> class B{...}
class A{ public: int mem; }
int main(){   
    A a;                          
    B<A,&A::mem> b= B<A,&A::mem>(a);  // I pass "A" as value
}

现在我想传递指针而不是值,如下所示:-

template<class T, int T::*a> class B{...}   
class A{ public: int mem; }
int main(){   
    A* a=new A();                           //changed
    B<A*,&A*::mem> b= B<A*,&A*::mem>(a);    //changed, pass "A*"  (#)
}

这是我遇到的编译错误。

prog.cpp:18:13: error: template argument 2 is invalid
    B<A*,&A*::mem> b=B<A*,&A*::mem>(a);
             ^

我在行 (#) 上错了。我应该如何编辑该行?

编辑

这是完整的代码:-

class A{
    public: int x=2;
};
template <class T, int T::*a> class B{
    T objectA_;
    public: B(T objectA){
        objectA_ = objectA;
    }
    public: void print(){
        std::cout<< objectA_.*a ;
    }
};
int main() {
    A objectA; objectA.x=3;
    B<A,&A::x> objectB=B<A,&A::x>(objectA);  //this line will be changed
    objectB.print();   //print 3
    return 0;
}

注意 T=A。 现在,我想要 T=A*.

新版本

template <class T, int A::*a> class B{
    T objectA_;
    public: B(T objectA){
        objectA_ = objectA;
    }
    public: void print(){
        std::cout<< objectA_->*a ;  //changed
    }
};
int main() {
    A* objectA = new A(); objectA->x=3;      //changed
    B<A*,&A*::x> objectB=B<A*,&A*::x>(objectA);   //changed
    objectB.print();
    delete objectA;                 //new
    return 0;
}

B<A, &A::mem> 仍然是正确的形式。您需要更改的是 class 定义。

template<class T, int T::*a>
class B
{
  T *object_;
public:
  B (T* pObj) : object_(pObj) {}
};

但是 如果您可以访问智能指针实现(c++11 或其他),则更愿意存储它而不是原始指针。如果不这样做,则必须遵守 the rule of three (now rule of five in c++11).

此外,如果您进行值初始化而不是复制初始化,您可以大大简化您的生活。

B<A, &A::mem> b(a);
B<A, &A::mem> b(&a);