아래 코드와 관련하여 컴파일러에서 호출 할 템플릿 함수를 선택하는 방법은 무엇입니까? const T & 함수가 생략되면 T & 함수가 항상 호출됩니다. T & 함수가 생략되면 const T & 함수가 항상 호출됩니다. 둘 모두 포함 된 경우 결과는 다음과 같습니다.컴파일을 통해 어떤 템플릿 함수를 호출 할 수 있습니까?
#include <iostream>
#include <typeinfo>
template <typename T>
void function(const T &t)
{
std::cout << "function<" << typeid(T).name() << ">(const T&) called with t = " << t << std::endl;
}
template <typename T>
void function(T &t)
{
std::cout << "function<" << typeid(T).name() << ">(T&) called with t = " << t << std::endl;
}
int main()
{
int i1 = 57;
const int i2 = -6;
int *pi1 = &i1;
int *const pi3 = &i1;
const int *pi2 = &i2;
const int *const pi4 = &i2;
function(pi1); ///just a normal pointer -> T&
function(pi2); ///cannot change what we point to -> T&
function(pi3); ///cannot change where we point -> const T&
function(pi4); ///cannot change everything -> const T&
return 0;
}
/* g++ output:
function<Pi>(T&) called with t = 0x22cd24
function<PKi>(T&) called with t = 0x22cd20
function<Pi>(const T&) called with t = 0x22cd24
function<PKi>(const T&) called with t = 0x22cd20
*/
/* bcc32 output:
function<int *>(T&) called with t = 0012FF50
function<const int *>(T&) called with t = 0012FF4C
function<int *>(const T&) called with t = 0012FF50
function<const int *>(const T&) called with t = 0012FF4C
*/
/* cl output:
function<int *>(T&) called with t = 0012FF34
function<int const *>(T&) called with t = 0012FF28
function<int *>(const T&) called with t = 0012FF34
function<int const *>(const T&) called with t = 0012FF28
*/
약간의 트릭에
분명히 상수 포인터. '__PRETTY_FUNCTION__'은 템플릿 매개 변수 유형 [ "Pi"대신 "int *"]을 포함하여 함수를 설명하는 올바른 형식의 문자열을 제공합니다. g ++에서'typeid (T) .name()'에 대한 기본 동작이 꽤 비밀 스럽기 때문에 템플릿이 어떻게 작동 하는지를 배울 때 이것은 매우 귀중하다는 것을 알았습니다. 나는'__FUNCSIG__'이 VS에서 비슷한 기능을 제공한다고 믿지만 검증 할 수있는 권한이 없다. –