有一个模板函数
template<typename T>
void function(T num){
T tmp;
memset(&tmp,0,sizeof(tmp)); //现在我是这么初始化的
}
然后我需要在函数里定义一个临时变量
T tmp
但这个T有可能是类类型(string), 也可能是内建类型(int, double)
那我要怎么初始化?
现在我是用memset()初始化的;
但如果sum这对象不在一块连续内存或者他定义时会初始化一些特殊成员, 这种方法就不行...
天蓬老师2017-04-17 15:27:21
질문자의 의미는 0을 매개변수로 초기화할 수 있으면 0으로 초기화를 시도하고, 작동하지 않으면 기본 생성자를 사용하라는 것입니다.
으아악여기에 몇 가지 점이 있습니다. 하나는 스칼라 유형이 초기화되지 않고 스택의 가비지 데이터를 직접 사용하므로 해당 데이터가 0이 아니기 때문에 직접 T tmp
할 수 없다는 것입니다. 둘째, C 객체는 기본적으로 메모리 할당을 위해 구성되는 경우가 많기 때문에 C 메서드 memset
를 사용할 수 없습니다. 포인터가 0으로 설정되면 분할 오류나 메모리 누수가 발생합니다. 셋째, 객체를 직접 반환하기 때문에 T에 이동 생성자가 없으면 성능이 저하될 수 있습니다.
위 작성방식의 원리는 이렇습니다. Int와 int의 차이점을 활용하면 C 에서는 템플릿 결정을 내릴 때 보다 전문화된 함수(또는 오버로드된 함수)에 우선 순위를 부여하므로 다음 init_obj
이 위의 것보다 우선합니다. Enable은 0으로 초기화할 수 없는 유형에 대한 파생 오류를 생성하는 데 사용됩니다. C 의 SFINAE 정책은 이를 위의 유형으로 전송합니다. init_obj
; 여기서는 정수 유형이 암시적으로 포인터로 변환되지만 float는 그렇지 않기 때문에 0.f
가 사용됩니다. 그리고 float는 암시적으로 모든 숫자 유형으로 변환될 수 있습니다.
개인적으로 제 글이 보기 흉한 것 같아서 좀 더 나은 글쓰기를 부탁드리고 싶습니다(
C 11의 경우 위의 작성 방법이 좋습니다 :)