c++ - 结合了 const 和非常量引用数据成员的单一类

标签 c++ const-correctness

这是一组实现一种适配器模式的 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 和非 const 指针都作为类成员,并从重载的构造函数中设置一个或另一个来解决此类问题。这既浪费空间又显得笨拙。有更优雅的解决方案吗?

最佳答案

是的,可以做到:

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 或非 const 状态中。 Reader 拥有非常量引用,除非模板化类型是 const,但不允许您写入它,因此当您确实需要写入时,您可以像使用 CHolderReaderWriter 一样扩展它。

关于c++ - 结合了 const 和非常量引用数据成员的单一类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9378842/

相关文章:

c++ - 使用 const_cast 添加 const 时的未定义行为?

constants - D 中的逻辑常量

c++ - std::enable_if,模板特化和继承

c++ - 当我单击用户界面中应该播放音乐文件的按钮时,.exe 文件关闭

pointers - inout-parameter - 用另一个替换一个常量句柄

我可以将 const char* 数组传递给 execv 吗?

c++ - 为什么 "gptr"类型的basic_streambuf是char_type*而不是const char_type*?

c++ - 如何使用 boost::unit_test?

c++ - 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440

c++ - 关于如何使用 cpp-netlib 进行异步 http get 请求的示例