假设我有一个包含成员的主机类:
template<class p1, class p2>
struct host : public p1, public p2 {
double member;
};
我想在 p1 和 p2 中使用相同的成员:
struct p1 {
void f1() { host::member+=1;} // this is incorrect but I'm looking for this behavior
};
struct p2 {
void f2() {host::member*=2;}
};
有没有办法做到这一点?
我能想到的一种方法是通过虚拟继承从另一个包含成员的类派生p1
和派生,这使得事情变得复杂。p2
另一种是将成员作为函数的参数传递给策略。像这样的东西:
template<class p1, class p2>
struct host : public p1, public p2 {
double member;
void hf1() { p1::f1(member);}
void hf2() { p2::f2(member);}
};
struct p1 {
void f1(double m) { m+=1;} // this is incorrect but I'm looking for this behavior
};
struct p2 {
void f2(double m) {m*=2;}
};
另一个想法是使用 CRTP 并从策略中派生主机并从主机中派生策略,以便可以访问成员,using
但这是不可能的。
更新 (1)
我对 CRTP 的尝试
template<class p1, class p2>
struct host : public p1, public p2 {
double member;
};
template<host_type>
struct p1 : public host_type { // error: invalid use of incomplete type 'struct host<p1,p2>'
void f1() { host_type::member+=1;}
};
template<host_type>
struct p2 : public host_type<p1,p2> { // error: expected template-name before '<' token
void f2() {host_type::member*=2;}
};