这是一组实现一种适配器模式的C ++类:

#include <iostream>

class Cfoo
{
public:
    explicit Cfoo(int i):i_(i){}
    void SetI(int i){ i_ = i; }
    int GetI()const{ return(i_); }
private:
    int i_;
};

class CfooHolderConst
{
public:
    explicit  CfooHolderConst(const Cfoo& foo):foo_(foo){}
    int GetI()const{ return( foo_.GetI() ); }
private:
    const Cfoo& foo_;
};

class CfooHolderNonConst
{
public:
    explicit CfooHolderNonConst(Cfoo& foo):foo_(foo){};
    int GetI()const{ return( foo_.GetI() ); }
    void SetI(int i){ foo_.SetI(i); }
private:
    Cfoo& foo_;
};

int main(  int argc, char* argv[] )
{
    const Cfoo myConstFoo(42);
    CfooHolderConst myConstFooHolder(myConstFoo);
    std::cout << myConstFooHolder.GetI() << std::endl;

    Cfoo myNonConstFoo(1);
    CfooHolderNonConst myNonConstFooHolder(myNonConstFoo);
    myNonConstFooHolder.SetI(42);
    std::cout << myConstFooHolder.GetI() << std::endl;

    return(0);
}


我想将CfooHolderNonConst和CFooHolderConst合并到一个类中,否则,将从另一个继承一个。此处对Cfoo的引用是一个问题,因为在CFooHolderConst中需要将其定义为const Cfoo&,而在CfooHolderNonConst中则需要将其定义为Cfoo&。

这与interator / const_iterator的问题类似:
How to avoid code duplication implementing const and non-const iterators?

...但是我希望因为这不必满足STL迭代器要求,所以可能有一个更简单的解决方案。

过去,我已经通过将const和nonconst指针都作为类成员,并通过重载的构造函数设置了一个或另一个来解决了此类问题。这浪费了空间并且显得笨拙。有没有更优雅的解决方案?

最佳答案

是的,可以这样做:

template< typename T > CHolderReader
{
 public:
    explicit  CHolderBase( T& t):t_(t){}
    int Get()const { return t_.GetI(); }

 protected:
    ~CHolderReader() {}

 protected:
    T& t_;
};

template< typename T > CHolderReaderWriter : public CHolderReader< T >
{
public:
   void Set( int i)
   {
       t_.SetI(i);
   }
};

typedef CHolderReader<const Cfoo> CFooHolderConst;
typedef CHolderReaderWriter<Cfoo> CFooHolderNonConst;


实际上,这仅是一个示例,在其中将基础数据的获取包装为const或non-const状态。除非模板类型为const,否则Reader会持有一个非const引用,但不允许您对其进行写入,因此您在需要写入时可以像使用CHolderReaderWriter一样对其进行扩展。

10-07 13:35