2017-06-20 4 views
1

De même que pour How do I remove code duplication between similar const and non-const member functions?, je souhaite supprimer la duplication de code entre des fonctions membres presque identiques, à l'exception des qualificatifs ref.Comment puis-je supprimer la duplication de code entre des fonctions membres qualifiées de ref similaires?

Disons que j'ai une classe qui est quelque chose comme ceci:

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; 
    } 
}; 

Il est pas inconcevable que nous voudrions le faire pour un objet constructeur, car il enregistre une copie si nous avons fini avec la MyStringBuilder. A l'exception des cas où les membres sont utilisés, le code entre la version const& et la version && est identique. La seule différence entre les deux fonctions est que les && version std::move sont des membres chaque fois qu'ils sont référencés.

Comment puis-je éviter cette duplication de code?

Répondre

3

Une chose que vous pouvez faire est que vous pouvez mettre en œuvre la logique dans une fonction non-membre et de prendre le type de *this comme paramètre de modèle:

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)); 
    } 
};