Идеальная пересылка - PullRequest
       23

Идеальная пересылка

5 голосов
/ 09 июня 2011

Если у нас есть следующее:

template <class T>
struct B{
  T data;
}

struct A{
  int data_array[100];
}

int main()
{
  A x;
  const A x_const;

  auto y1 = f(A());
  auto y2 = f(x);
  auto y3 = f(x_const);
  auto y4 = f(std::move(x));
}

Я хочу знать f (желательно функцию, но макрос тоже подойдет), такой что:

decltype(y1) == B<A>
decltype(y2) == B<A&>
decltype(y3) == B<const A&>
decltype(y4) == B<A&&>

То есть f идеально перенаправляет x в объект B.

Ответы [ 3 ]

8 голосов
/ 09 июня 2011

Это невозможно. Для y1 и y4 они оба принимают значения типа A, но вы хотите, чтобы они возвращали разные типы. Откуда f знать, что вернуть?

3 голосов
/ 09 июня 2011
template <typename T>
auto f(T&& t) -> B<decltype(std::forward<T>(t))>
{
    return B<decltype(std::forward<T>(t))>{std::forward<T>(t)};
}

Это почти , что вы хотите. Единственная разница для первого типа B<A&&>, а не B<A>.

2 голосов
/ 09 июня 2011
auto y1 = f(A());
auto y4 = f(std::move(x));

Не будет различимым, так как A() создает временный объект, который будет связываться с A&&.

...