C++ c++;静态数组包装器
我正在尝试为静态数组构建一个包装器类,它的行为应该类似于标准的静态数组C++ c++;静态数组包装器,c++,operator-overloading,template-argument-deduction,C++,Operator Overloading,Template Argument Deduction,我正在尝试为静态数组构建一个包装器类,它的行为应该类似于标准的静态数组 int main() { int t[2][3] = {{77, 2, 3}, {4, 5, 6}}; auto a = make_array(t); auto b = a[0]; // gives a ArrayWrapper<int, 3> auto c = b[0]; // gives an int of value 77; return 0; } 另外,当ArrayWrapper仅包
int main()
{
int t[2][3] = {{77, 2, 3}, {4, 5, 6}};
auto a = make_array(t);
auto b = a[0]; // gives a ArrayWrapper<int, 3>
auto c = b[0]; // gives an int of value 77;
return 0;
}
另外,当ArrayWrapper
仅包含一个维度时,我不知道如何专门化[]操作符来返回基本类型。我猜当T不是数组但无法使其编译时,我应该专门化运算符
有人能告诉我当T是数组时,如何帮助g++为[]操作符进行模板推导吗
有人能告诉我当T不再是数组时,如何告诉[]运算符返回基本类型吗?为什么不使用std::array
?你的意思是我可以从std::array继承来重写[]运算符以执行我想要的操作?不,只需使用std::array
。如果我理解正确,std::array::operator[]
已经做了您想要做的事情(即它返回一个数组,您可以再次调用operator[]
来获取元素),而不是从标准容器继承
#include <cstdlib>
template <typename T, size_t N>
struct ArrayWrapper;
template<typename T, size_t N>
auto make_array(T const (&tab) [N])
{
return ArrayWrapper<T, N>(tab);
}
template <typename T, size_t N>
struct ArrayWrapper
{
ArrayWrapper(T const (&tab)[N])
: t(tab)
{
}
template<typename U, size_t M>
ArrayWrapper<U, M> operator[] (size_t i)
{
return make_array<U, M>(t[i]);
}
T const & t;
};
error: no match for ‘operator[]’ (operand types are ‘ArrayPrinter<int [3], 2>’ and ‘int’)
auto b = a[0];