gpt4 book ai didi

c++ - 类 C 数组模板特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:20 25 4
gpt4 key购买 nike

如何编写通用数组的模板

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; ,因为数组正在退化为指针,所以我可以“捕获”它?

编辑 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);
^

最佳答案

正确的模板是

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];的原因是什么?我正在考虑将引用与数组退化到指针进行对比,但如果有人向我更深入地解释它,我会非常高兴。

关于c++ - 类 C 数组模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47692290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com