완벽한 포워딩에 어려움이 있습니다.퍼펙트 포워딩 및 std :: tuple (또는 다른 템플릿 클래스)
다음은 현재 이해 수준입니다. glue Template + rvalue reference + std :: forward 및 특수 마법 모드는 템플릿 공제 규칙이 평소와 같은 의미는 아니지만 완벽하게 전달할 수 있도록 제작되었습니다. 예 :
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
하지만 T가 실제로 템플릿 기반 클래스 인 경우 어떻게됩니까? 예를 들어, std :: tuple을 완벽하게 전달하려면 어떻게해야합니까? T & &을 aboce로 사용하면 튜플에 포함 된 개체의 모든 유형 정보가 손실됩니다.
다음과 같은 코드가 작동하지 않을 수 있습니다 그러나 :
template <typename... Args>
void outer(std::tuple<Args...>&& t)
{
inner(std::forward<std::tuple<Args...>>(t));
use_args_types_for_something_else<Args...>(); // I need to have Args available
}
int main()
{
std::tuple<int, double, float> t(4, 5.0, 4.0f);
outer(t);
}
마지막 GCC 스냅 샷은 말한다 :
error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
를 그래서 명확하게, 우리가 일반적으로 템플릿이 아닌 경우에 여전히있는 곳 좌변은 바인딩 할 수 없습니다 rvalue reference에. "완벽한 forwading 모드"
그래서 나는 몰래하고 템플릿 템플릿으로 내 튜플을 통과하려 활성화되지 않은 :template <
typename... Args
template <typename...> class T
>
void outer(T<Args...>&& t)
{
inner(std::forward<T<Args...>>(t));
use_args_type_for_something_else<Args...>();
}
을하지만 난 여전히 같은 오류가 발생합니다. 이 때문에
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
위 작품 : 매개 변수의 유형이 기능을위한 템플릿 유형은, 그래서 완벽한 전달을 달성하는 유일한 방법은 첫 번째 예와 같은 경우에만
유형을 지정하지 않고 std :: forward를 호출 할 수는 없습니까 (템플릿 함수이고 공제를 사용할 수 있습니까?). 'std :: forward (t)' – SoapBox