2017-06-20 41 views
1

How do I remove code duplication between similar const and non-const member functions?类似,我想删除几乎相同的成员函数之间的代码重复,除了ref修饰符。如何删除类似的ref-qualified成员函数之间的代码重复?

比方说,我有一个类,是这样的:

class MyStringBuilder 
{ 
    std::string member; 
public: 
    // Other functions 
    std::string create() const& { 
     // Some work 
     std::string result = member; 
     // More work 
     return result; 
    } 

    std::string create() && { 
     // Some work 
     std::string result = std::move(member); 
     // More work 
     return result; 
    } 
}; 

这并不是不可想象的,我们将要为一个生成器对象做到这一点,因为它节省了一个副本,如果我们与MyStringBuilder完成。

除了使用成员的地方,const&版本和&&版本之间的代码是相同的。这两个函数之间的唯一区别是&&版本std::move是任何成员,只要它们被引用。

如何避免此代码重复?

回答

3

一两件事你可以做的是,你可以在一个非成员函数实现逻辑和采取的*this类型作为模板参数:

class MyStringBuilder 
{ 
    std::string member; 

    template<typename Self> 
    static std::string create_impl(Self&& self) { 
     // Some work 
     std::string result = std::forward<Self>(self).member; 
     // More work 
     return result; 
    } 
public: 
    // Other functions 
    std::string create() const& { 
     return create_impl(*this); 
    } 

    std::string create() && { 
     return create_impl(std::move(*this)); 
    } 
};