찾다

 >  Q&A  >  본문

C++模板函数中临时变量初始化问题

有一个模板函数

template<typename T>
void function(T num){
    T tmp;
    memset(&tmp,0,sizeof(tmp));    //现在我是这么初始化的
}

然后我需要在函数里定义一个临时变量

T tmp

但这个T有可能是类类型(string), 也可能是内建类型(int, double)
那我要怎么初始化?
现在我是用memset()初始化的;
但如果sum这对象不在一块连续内存或者他定义时会初始化一些特殊成员, 这种方法就不行...

迷茫迷茫2807일 전716

모든 응답(3)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-17 15:27:21

    C 11의 균일한 초기화:

    으아악

    글을 쓰기 전에:

    으아악

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 15:27:21

    @시히라

    으아악

    회신하다
    0
  • 天蓬老师

    天蓬老师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의 경우 위의 작성 방법이 좋습니다 :)

    회신하다
    0
  • 취소회신하다