一种通用的C++类或者结构成员变量的初始化方法
C++11提供了新的特性,可以初始化一些类或者结构成员变量,尤其某类实例化的变量的初始化,下面介绍一种在C++98中也可以初始化类成员变量的通用方法:
先上代码
#include <iostream>
#include <stdint.h>
template<typename T=bool>
struct CA
{
CA(int init_size):length(0), item_size(init_size){}
const T operator[](int idx) const
{
return static_cast<T>(idx*idx);
}
int length;
int item_size;
};
struct CB
{
CA<int> ca(10);
};
int main()
{
CB cb;
std::cout << "cb[5] = " << cb.ca[5] << "\n";
return 0;
}
这段代码一定编译不过,因为
main.cpp:23:16: error: expected identifier before numeric constant
CA<int> ca(10);
^~
main.cpp:23:16: error: expected ',' or '...' before numeric constant
main.cpp: In function 'int main()':
main.cpp:29:39: error: invalid types '<unresolved overloaded function type>[int]' for array subscript
std::cout << "cb[5] = " << cb.ca[5] << "\n";
^
在C++11中,可通过
CA<int> ca = 10;
来解决这一问题。下面介绍另外一种方法,就是通过模板初始化来解决,在C++98中也能兼容
#include <iostream>
#include <stdint.h>
template<
typename T=bool,
int init_array_size = 0>
struct CA
{
CA(): length(0), item_size(init_array_size){}
CA(int init_size):length(0), item_size(init_size){}
const T operator[](int idx) const
{
return static_cast<T>(idx*idx);
}
int length;
int item_size;
};
struct CB
{
CA<int, 10> ca;
};
int main()
{
CB cb;
std::cout << "cb[5] = " << cb.ca[5] << "\n";
return 0;
}
主要的改动在
- CA template中加入init_array_size 模板参数
- CA的无参数构造函数的实现
- 成员变量ca的类型改为CA<int, 10>