8

这是我的示例类:

template<typename T> class MyClassVector
{
    public:
        inline const std::vector<T>& data() const
        {
            return _data;
        }

    protected:
        std::vector<T> _data;
};

template<typename T, unsigned int SIZE> class MyClassArray
{
    public:
        inline const /* SOMETHING */ data() const
        {
            return _data; // OR SOMETHING ELSE
        }

    protected:
        T _data[SIZE];
};

我的问题是: MyClassArray 类返回对基础 _data 容器的常量引用的 MyClassVector data() 函数的等价物是什么?

非常感谢你 !

4

5 回答 5

13

有两种方法可以做到这一点:直接的和可读的:

直接的:

inline T const (& data() const)[SIZE] {
  return _data;
}

可读性:

typedef T Data[Size];
inline Data const& data() const {
  return _data;
}
于 2012-08-08T04:07:10.987 回答
2

最接近的语法是返回对 const T 数组的引用。简单的编写方法是通过 typedefs:

template <typename T, unsigned int N>
class MyClassArray {
public:
   typedef T array_t[N];
   typedef const T carray_t[N];
   array_t _data;

   carray_t& data() const {
      return _data;
   }
};

更难阅读的方式实际上是在函数声明中拼写类型:

const T (&foo() const)[N] {
   return _data;
}
于 2012-08-08T03:52:35.073 回答
0

由于数组只是衰减为指针,因此无法安全地执行此操作。等价的将返回一个 const 指针,但是调用者无法知道大小。

无论如何,没有理由再使用原始数组了。Std::array 可以解决这个问题并且更好地使用。

编辑,没关系可以传递对原始数组的引用(见上文)。这并不意味着你应该这样做。std::array更好。

于 2012-08-08T03:05:32.210 回答
0

您可以返回对 Tconst的大小数组的引用SIZE。我不知道它的语法是什么,但您可以使用类型特征来生成它。但更相关的是,你只是在复制很差std::array<T, N>,这也可以在 Boost/TR1 中找到,所以这有点浪费时间。

#include <type_traits>

class X {
    int arr[5];
    std::add_reference<std::add_const<int[5]>::type>::type foo() {
        return arr;
    }
};

这将返回对您的数组的大小感知 const 引用。

于 2012-08-08T03:08:43.133 回答
0

为什么不将数组公​​开为指向 T 的 const 实例的指针?还有数组的大小?

template<typename T, std::size_t SIZE>
class MyClassArray {
public:
    inline const int* data() const
    {
        return _data;
    }

    inline std::size_t size() const
    {
        return SIZE;
    }

protected:
    std::size_t _data[SIZE];
};

有一种类似的方法:参见std::stringc_str()size()成员函数。

于 2012-08-08T06:06:18.743 回答