2017-06-20 65 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)); 
    } 
};