template<class T, class U> decltype(∗(T∗)(0)∗∗(U∗)(0)) mul(T x, U y) { return x∗y; }
에서 (T*)(0)이 뭔 뜻임? T가 뭐여야지 (T*)(0)이 성립할까
댓글 4
저거 컴파일 타임 템플릿 테크닉인데, 그냥 nullptr == 0이라고 보면 됨. decltype(∗(T∗)(0)∗∗(U∗)(0)) 자체는 T의 임의 &(레퍼런스) 달린 것과 U의 임의 & 달린 것을 인자 타입으로 하는 곱하기 연산자 오버로딩이 있을 경우에, 그 오버로딩된 함수의 리턴값을 mul 의 리턴타입으로 쓰겠다는거 아마
노이ㄴ(liliilli)2019-12-22 00:23
답글
만약 원하는 인자의 타입이 rvalue ref라면 declval 써도 되긴 하겠지만, 그게 아니니 걍 declval 과는 다르게 아무때나 붙여서 쓸 수 있음
노이ㄴ(liliilli)2019-12-22 00:23
답글
와 아직 이해가 안가는데 찬찬히 읽어볼게
ㄱㅅㄱㅅ
익명(175.119)2019-12-22 00:25
답글
아마 SFINAE 같으니까 주어진 T랑 U 사이에 해당 오버로딩을 못 찾을 경우에는, 템플릿 코드 생성이 가능한 오버로딩된 다른 mul 함수를 볼 것 같고 아예 없을 경우에는 컴파일 에러 뜰 듯...
저거 컴파일 타임 템플릿 테크닉인데, 그냥 nullptr == 0이라고 보면 됨. decltype(∗(T∗)(0)∗∗(U∗)(0)) 자체는 T의 임의 &(레퍼런스) 달린 것과 U의 임의 & 달린 것을 인자 타입으로 하는 곱하기 연산자 오버로딩이 있을 경우에, 그 오버로딩된 함수의 리턴값을 mul 의 리턴타입으로 쓰겠다는거 아마
만약 원하는 인자의 타입이 rvalue ref라면 declval 써도 되긴 하겠지만, 그게 아니니 걍 declval 과는 다르게 아무때나 붙여서 쓸 수 있음
와 아직 이해가 안가는데 찬찬히 읽어볼게 ㄱㅅㄱㅅ
아마 SFINAE 같으니까 주어진 T랑 U 사이에 해당 오버로딩을 못 찾을 경우에는, 템플릿 코드 생성이 가능한 오버로딩된 다른 mul 함수를 볼 것 같고 아예 없을 경우에는 컴파일 에러 뜰 듯...