Предположим, что у меня есть два struct
S:Совершенная пересылка элемента объекта
struct X {};
struct Y { X x; }
У меня есть функции:
void f(X&);
void f(X&&);
Как написать функцию g()
, которая принимает Y&
или Y&&
но идеальный переадресацию X&
или X&&
до f()
, соответственно:
template <typename T>
void g(T&& t) {
if (is_lvalue_reference<T>::value) {
f(t.x);
} else {
f(move(t.x));
}
}
Приведенный выше код иллюстрирует мое намерение, но не очень масштабируемо по мере увеличения числа параметров. Есть ли способ заставить его работать для идеальной пересылки и сделать его масштабируемым?
Я думаю, что изменение 'is_lvalue_reference :: value' к' is_lvalue_reference (т))> :: value' будет иметь семантику, которую вы хотите, но я думаю, что ваша желаемая семантика сомнительна ... –
ildjarn
(Извините за неудачный ответ.) Я бы сказал, что причина, по которой он не масштабируется, заключается в том, что дизайн сомнительный для начала. Что значит «переместить» подобъект? В каком состоянии это оставляет основной объект? Даже если бы был простой способ написать это, это выглядит плохо структурированный код ... –