有一个模板函数
template<typename T>
void function(T num){
T tmp;
memset(&tmp,0,sizeof(tmp)); //现在我是这么初始化的
}
然后我需要在函数里定义一个临时变量
T tmp
但这个T有可能是类类型(string), 也可能是内建类型(int, double)
那我要怎么初始化?
现在我是用memset()初始化的;
但如果sum这对象不在一块连续内存或者他定义时会初始化一些特殊成员, 这种方法就不行...
c++11的统一初始化:
以前应该可以写:
@Shihira
呃呃我理解题主的意思是能用0这个参数初始化的就尽量用0初始化,其它不行的就用默认构造函数。
这里有几个点,一个是不能直接
T tmp
,因为Scalar Type会不初始化以至于直接使用栈当中的垃圾数据,以至于其数据不是0。二是不能用memset
这种C的方法,因为C++的对象很多时候默认构造会分配内存,如果把指针置零会产生段错误或者内存泄漏。三是这里因为直接返回一个对象,如果T没有移动构造函数可能会降低性能。上面这个写法的原理是这样的。利用Int和int的差别,因为C++在模板决策的时候会优先选择特化程度更高的函数(或曰重载过的函数),所以下面一个
init_obj
比上面的的更加优先。Enable用于对不能用0初始化的类型产生推导错误,C++的SFINAE政策将其转移到上面一个init_obj
;这里用0.f
是因为整型类型会隐式转换到指针,但是float不会,并且float还可以隐式转换到任意一种数字类型。个人觉得自己写得很难看,求更好的写法(
C++11的场合,楼上的写法是很棒的:)