Как убрать дублирование кода между похожими функциями-членами с квалификацией ref?

Аналогично Как удалить дублирование кода между похожими константными и неконстантными функциями-членами? Я хочу удалить дублирование кода между почти одинаковыми функциями-членами, за исключением квалификаторов ref.

Допустим, у меня есть класс, который выглядит примерно так:

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Любые участники, когда на них ссылаются.

Как я могу избежать этого дублирования кода?

1 ответ

Решение

Одна вещь, которую вы можете сделать, это вы можете реализовать логику в функции, не являющейся членом, и взять тип *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));
    }
};
Другие вопросы по тегам