У меня есть следующий класс:
template<typename T>
class Foo {
// ...
void frobnicate(const T& arg) {
// [lots of code here]
do_the_thing(arg);
// [lots of code here]
}
void frobnicate(T&& arg) {
// [lots of code here, same as above]
do_the_thing(std::move(arg));
// [lots of code here, same as above]
}
}
Есть ли способ удалить дублирование кода между двумя версиями frobnicate
без введения вспомогательных функций post и pre?
В идеале я хотел бы написать что-то вроде:
void frobnicate(/*what goes here?*/ arg) {
// [lots of code here]
if (is_rvalue_reference(arg))
do_the_thing(std::move(arg));
else
do_the_thing(arg);
// [lots of code here]
}
Есть ли способ сделать это?
Я думаю, если бы T
не было аргументом шаблона класса кроме аргумента шаблона функции, я мог бы, вероятно, использовать умный вывод аргумента шаблона (хотя я и не уверен, как именно я это сделаю), но с вовлеченным классом я не уверен, с чего начать ...