繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM