0

假设我有一个包含成员的主机类:

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

1 回答 1

1

这是一种无需从主机继承策略即可执行 CRTP 的方法

template <typename DerivedT>
struct p1
{
    DerivedT&       derived()       { return *static_cast<DerivedT*>(this);       }
    const DerivedT& derived() const { return *static_cast<const DerivedT*>(this); }

    void f1()
    {
        derived().member += 1;
    }
};

template <typename DerivedT>
struct p2
{
    DerivedT&       derived()       { return *static_cast<DerivedT*>(this);       }
    const DerivedT& derived() const { return *static_cast<const DerivedT*>(this); }

    void f2()
    {
        derived().member *= 2;
    }
};

struct host : public p1<host>, public p2<host>
{
     double member;
};
于 2013-09-12T06:46:19.960 回答