[英]Initialize C++ array member in template class
我需要实现一个安全的数组类,在访问底层C数组时控制索引:
template <typename T, int N> class SafeArray
{
public:
T &operator[](int index)
{
assert(0 <= index && index < N);
return m_data[index];
}
private:
T m_data[N];
};
而不是bool a[3];
,现在我写SafeArray<bool, 3> a;
。
我如何支持像bool b[3] = {false};
数组初始化bool b[3] = {false};
? 我的意思是我应该怎样做才能在SafeArray<bool, 3> b;
之后得到b.m_data[] = {false, false, false}
SafeArray<bool, 3> b;
已建成?
我想我应该为SafeArray
添加一个构造函数,但是那个构造函数的主体是什么? 模板参数T
可以是任何东西,不一定是bool
。 我正在使用pre-C ++ 11。
我的意思是我应该怎么做才能在
SafeArray<bool, 3> b;
之后得到b.m_data[] = {false, false, false}
SafeArray<bool, 3> b;
已建成?
我不确定我是否理解你的问题,但如果我这样做,那么你需要做的就是编写一个初始化你的数组的默认构造函数:
SafeArray() : m_data()
{
}
完整的代码:
template <typename T, int N> class SafeArray
{
public:
SafeArray() : m_data()
{
}
T &operator[](int index)
{
assert(0 <= index && index < N);
return m_data[index];
}
private:
T m_data[N];
};
一个现实的例子 。
由于您使用的是C ++ 03(因此您没有std::array
),我宁愿向您推荐boost::array
,它基本上是std::array
的C ++ 03实现。 (实际上, std::array
灵感来自boost::array
)。
否则,使您的类成为聚合,即(根据C ++ 03 8.5.1 / 1)
聚合是一个数组或类(第9节),没有用户声明的构造函数,没有私有保护的非静态数据成员(第11节),没有基类(第10节),也没有虚函数。
然后你的类将支持聚合初始化。
更新:再次阅读OP(和Andy Prowl的回答 ),我不确定我是否理解这个问题。 我在这里建议的是一种在施工时初始化SafeArray
的方法,例如,
SafeArray<bool, 3> b = { false, false, false };
关于什么...?
SafeArray() {
for (int i = 0; i < N; ++i) {
m_data[i] = T();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.