C++ 11의 전달 방법을 이해합니다.rvalue 인수에 대한 템플릿 유형 공제
template <class T> void foo(T &&)
foo는 이제 lvalues와 rvalues를 모두 허용합니다.
내 문제는 foo를 더욱 오버로드 할 때입니다. 이 간단한 코드를 고려 : 내가 A <int> &
(좌변) 객체 foo
를 호출 할 경우
template <class T> class A {};
template <class T> void foo(T &&obj) {}
template <class T> void foo(A<T> &&obj) {}
int main() {
int i;
A<int> a;
foo(i); // calls foo(T &&) as I want
foo(a); // calls foo(T &&), but I want it to call foo(A<T> &&)
return 0;
}
를, 그것은 foo(T &&)
, 그리고 foo(A <T> &&)
를 호출합니다. obj
이 A<T>
또는 아니지만, 내가 obj
에서 A
메소드를 호출해야하므로이, 아주 아주 지저분한 코드를 생성하고, obj
이 T
로 선언하고,하지 않은 경우 foo(T &&obj)
의 정의에서, 나는 표준 및 사용자 정의 특성으로 구분 관리 A <T>
. 선언을 재정렬하거나 lvalue 오버로드를 추가해도 문제가 해결되지 않습니다.
희망은 나 자신을 이해하게 만들었습니다. 문제를 해결하기 위해 간단한 코드를 제공했습니다. 나는 (boost::optional
유사) 사용자 정의 Optional <T>
클래스를 구현, 그리고 난 다른 Optional <T>
, Optional <U>
, T
또는 U
객체에서 Optional <T>
객체를 생성 (및 지정) 할 수 있어야합니다 나는 생성자에서이 문제를 가지고있다. 여기서 T
은 생성 될 선택적 개체에 의해 보유되는 유형이고 U
은 T
으로 변환 가능한 다른 유형입니다.
감사합니다. 매개 변수 유형은 이력서 - 자격이 템플릿 매개 변수는 [temp.deduct.call]/3
[P
인 경우 함수 호출에 대한 템플릿 인수 공제 동안
스택 오버플로 규칙의 전문성이 있는지 확인 : 영업 이익이 "이해"로 시작하면, 그들은하지 않습니다. 'A'과 같은 방식으로 작동하지 않는'T' 공제에 대해서는 특별한 것이 있습니다. –
[이 예에서는] (http://ideone.com/jN2T2m)와 같이 원하는 오버로드를 직접 추가하는 것이 가장 쉽습니다. SFINAE를 사용하는 복잡한 회선 솔루션을 만들 수는 있지만 그 중 많은 이점이 있다고 생각하지 않습니다. –
T는 범용 참조입니다. 반면에 A은 평범한 오래된 rvalue 참조입니다. –
aaronman