3

我需要实现一个安全的数组类,在访问底层 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。我正在使用 C++11 之前的版本。

4

3 回答 3

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

还有一个活生生的例子

于 2013-06-21T10:36:27.320 回答
0

由于您使用的是C++ std::array03 (因此您没有. (其实是受到了启发)。boost::arraystd::arraystd::arrayboost::array

否则,将您的类设为聚合,即(根据 C++03 8.5.1/1)

聚合是一个数组或类(第 9 条),没有用户声明的构造函数,没有私有受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数。

然后你的类将支持你想要的聚合初始化。

更新:再次阅读 OP(和Andy Prowl回答),我不确定我是否理解这个问题。我在这里提出的是一种SafeArray在施工时进行初始化的方法,例如,

SafeArray<bool, 3> b = { false, false, false };
于 2013-06-21T10:37:21.480 回答
0

关于什么...?

SafeArray() {
    for (int i = 0; i < N; ++i) {
        m_data[i] = T();
    }
}
于 2013-06-21T10:41:39.583 回答