템플릿 기능이 있다고 가정 해 봅시다. assign()
. 그것은 포인터 값을 취하고 포인터의 목표에 값을 할당 : 난 항상 T
는 첫 번째 인수에서 추론 할 할이 경우템플릿 매개 변수 공제에 하나의 인수를 사용합니까?
template <typename T> void assign(T *a, T b) { *a = b; }
int main() {
double i;
assign(&i, 2);
}
,하지만 좋은 일을하지 않은 것 같습니다 이것을 표현하는 것. 2
의 유형은 그래서, int
입니다 :
deduce.cpp:5:5: error: no matching function for call to 'assign' assign(&i, 2); ^~~~~~ deduce.cpp:1:28: note: candidate template ignored: deduced conflicting types for parameter 'T' ('double' vs. 'int') template void assign(T *a, T b) { *a = b; }
는 두 번째 인수는 템플릿 매개 변수 공제에 참여하지 않도록 내가 assign()
를 선언 할 수있는 방법이 있나요?
그래서, 하나의 문제점은 비효율적이다. 'T'가'std :: vector'라고 가정합니다. 인수'b'는 값에 의해 취해진 다음,'a'에 복사 (이동되지 않음)됩니다. 작은 개선은'assign '의 구현을'* a = std :: move (b)'로 바꾸는 것일 수 있습니다. 원시 타입은 비용이 들지 않으며 복잡한 타입은 많이 절약 할 수 있습니다. 커다란 개선은 앞으로 'b'를 완벽하게하는 것입니다. – Yakk
@Yakk 전적으로 동의 함 - 방금 같은 유형의 포인터와 값을 취하는 함수의 예제로 작성했습니다. 실제로는 프리미티브 만 사용하고이 사람보다 더 유용합니다 :). – s4y