Я хочу передать и переслать кортежи, содержащие значение r refue. Но я не могу получить доступ к элементу кортежа и выполнить переадресацию правильным способом.
В этом примере я также предоставляю структуру с именованными элементами вместо std::tuple
, которая работает хорошо.
Поэтому я сам не могу найти ответ, как написать эту строку:
return Y{ std::forward<decltype(std::get<0>(t))>( std::get<0>( t ) ) };
, чтобы я получил перенаправленный правильный тип.
Полный пример:
#include <iostream>
#include <tuple>
class X
{
private:
int data;
public:
X( int _data ): data{_data}{}
};
class Y
{
public:
Y( const X& ) { std::cout << "copy" << std::endl; }
Y( X&& ) { std::cout << "move" << std::endl; }
};
struct Sm { X&& x; };
struct Sc { X& x; };
template < typename AnyS >
Y func( const AnyS& s )
{
return Y{ std::forward<decltype(s.x)>(s.x) };
}
template < typename ... PARMS >
Y func( const std::tuple< PARMS... >& t )
{
return Y{ std::forward<decltype(std::get<0>(t))>( std::get<0>( t ) ) };
}
int main()
{
Sm sm{ X{1} };
Y ym = func( sm ); // should move, fine works
X x{1};
Sc sc{ x };
Y yc = func( sc ); // should copy, fine works
Y ytm = func( std::tuple< X& >{ x }); // should copy, works
Y ytc = func( std::tuple< X&& >{ X{1} }); // should move but copies! FAIL
}
Я знаю, что могу использовать ссылку на пересылку для самого кортежа. Это будет работать нормально, но это невозможно в моем коде, так как я намеренно должен иметь некоторое дублирование данных внутри него, которое не будет работать, если я перенаправлю сам кортеж по ссылке rvalue. Если бы я мог использовать это, я просто могу использовать make_from_tuple .