在模板类中初始化C ++数组成员

时间:2013-06-21 10:22:53

标签: c++ arrays templates

我需要实现一个安全数组类,在访问底层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。

3 个答案:

答案 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];
};

live example

答案 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 Prowlanswer),我不确定我是否理解这个问题。我在这里建议的是一种在施工时初始化boost::array的方法,例如,

SafeArray

答案 2 :(得分:0)

怎么样??

SafeArray() {
    for (int i = 0; i < N; ++i) {
        m_data[i] = T();
    }
}