我需要实现一个安全数组类,在访问底层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};
这样的数组初始化?我的意思是在构建b.m_data[] = {false, false, false}
之后我该怎么办才能获得SafeArray<bool, 3> b;
?
我想我应该向SafeArray
添加一个构造函数,但是该构造函数的主体是什么?模板参数T
可以是任何内容,不一定是bool
。我正在使用pre-C ++ 11。
答案 0 :(得分:1)
我的意思是在构建
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];
};
答案 1 :(得分:0)
由于您使用的是C ++ 03(因此您没有std::array
)我宁愿向您推荐boost::array
,这基本上是{{1}的C ++ 03实现}。 (实际上,std::array
的灵感来自std::array
)。
否则,使您的类成为聚合,即(根据C ++ 03 8.5.1 / 1)
聚合是一个数组或类(第9节),没有用户声明的构造函数,没有私有保护的非静态数据成员(第11节),没有基类(第10节),也没有虚函数。
然后你的类将支持聚合初始化。
更新:再次阅读OP(以及Andy Prowl的answer),我不确定我是否理解这个问题。我在这里建议的是一种在施工时初始化boost::array
的方法,例如,
SafeArray
答案 2 :(得分:0)
怎么样??
SafeArray() {
for (int i = 0; i < N; ++i) {
m_data[i] = T();
}
}