C-like Array模板专业化

时间:2017-12-07 09:59:03

标签: c++ arrays templates struct

如何编写通用数组

的模板
template <class T, std::size_t N>
struct Data<T[N]> {}

我可以通过[]运算符(或任何其他方式)访问它的元素吗?

#include <fstream>
#include <iostream>
#include <sstream>
#include <utility>

template <typename T>
struct Data;

template <typename T>
std::ostream& operator<<(std::ostream& os, const Data<T>& val) {
    return val(os);
}

template <typename T>
Data<std::remove_cv_t<T>> data(const T& val) { return { val }; }

template <>
struct Data<int> {
    std::ostream& operator()(std::ostream& os) const {
        os << val;
        return os;
    }
    const int& val;
};

template <class T, std::size_t N>
struct Data<T[N]> {
    std::ostream& operator()(std::ostream& os) const {
        for (std::size_t i = 0; i < N; i++) {
            os << data(val[i]);
        }
        return os;
    }
    T val;
};

访问时出错:

error: subscripted value is not an array, pointer, or vector
                    os << data(val[i]);
                               ^~~ ~

似乎我应该更改<T[N]>之类的<T(&)[N]>来捕捉数组的引用,但我无法解决这个问题。 或者T val;可能在T* val;中,因为数组正在退化为指针,所以我可以&#34;捕获&#34;它?

编辑1

对于T val[N];,错误是:

error: cannot initialize an array element of type 'int' with an lvalue of type 'int const[2]'
Data<std::remove_cv_t<T>> data(const T& val) { return { val }; }
                                                    ^~~

编辑2

当我尝试使用

template <typename T, size_t N>
struct Data<std::array<T, N> >

然后它与任何模板都不对应。

error: implicit instantiation of undefined template 'PrettyPrint::Data<int [2]>'
    sstream << PrettyPrint::data(val);
               ^

1 个答案:

答案 0 :(得分:1)

正确的模板是

template <typename T, std::size_t N>
struct Data<T[N]> {
    std::ostream& operator()(std::ostream& os) const {
        for (std::size_t i = 0; i < N; i++) {
            os << data(val[i]);
        }
        return os;
    }
    const T(&val)[N];
};

const T(&val)[N];的原因是什么?我正在考虑将这个引用与数组退化相对于指针进行对比,但如果有人向我更深入地解释它,我会很高兴。