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

时间:2016-06-08 08:07:14

标签: c++ templates non-static

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

很难解释,所以我会展示一个很短的代码来表明问题。

这是一个有效的代码: -

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;
}

1 个答案:

答案 0 :(得分:1)

B<A, &A::mem>仍然是正确的形式。你需要改变的是类定义。

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);