Как убрать дублирование кода между похожими функциями-членами с квалификацией 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));
}
};
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]