How do I remove code duplication between similar const and non-const member functions?

后端 未结 19 2000
天涯浪人
天涯浪人 2020-11-22 00:30

Let\'s say I have the following class X where I want to return access to an internal member:

class Z
{
    // details
};

class X
{
    std::vec         


        
19条回答
  •  萌比男神i
    2020-11-22 01:13

    Yes, it is possible to avoid the code duplication. You need to use the const member function to have the logic and have the non-const member function call the const member function and re-cast the return value to a non-const reference (or pointer if the functions returns a pointer):

    class X
    {
       std::vector vecZ;
    
    public:
       const Z& z(size_t index) const
       {
          // same really-really-really long access 
          // and checking code as in OP
          // ...
          return vecZ[index];
       }
    
       Z& z(size_t index)
       {
          // One line. One ugly, ugly line - but just one line!
          return const_cast( static_cast(*this).z(index) );
       }
    
     #if 0 // A slightly less-ugly version
       Z& Z(size_t index)
       {
          // Two lines -- one cast. This is slightly less ugly but takes an extra line.
          const X& constMe = *this;
          return const_cast( constMe.z(index) );
       }
     #endif
    };
    

    NOTE: It is important that you do NOT put the logic in the non-const function and have the const-function call the non-const function -- it may result in undefined behavior. The reason is that a constant class instance gets cast as a non-constant instance. The non-const member function may accidentally modify the class, which the C++ standard states will result in undefined behavior.

提交回复
热议问题