Идеальная пересылка члена объекта

Предположим, у меня есть две 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));
  }
}

Приведенный выше код иллюстрирует мое намерение, но не очень масштабируемый, поскольку количество параметров растет. Есть ли способ заставить его работать для идеальной пересылки и сделать его масштабируемым?

16
задан curiousguy 23 December 2011 в 04:19
поделиться