【发布时间】:2015-10-27 22:06:32
【问题描述】:
我正在将一些 Fortran90 代码移植到 C++(因为我很愚蠢,为了保存“为什么?!”)。
Fortran 允许指定数组的范围,特别是从负值开始,例如
double precision :: NameOfArray(FirstSize, -3:3)
我可以用 C++ 写成类似的东西
std::array<std::array<double, 7>, FirstSize> NameOfArray;
但现在我必须像 NameOfArray[0:FirstSize-1][0:6] 这样的索引。如果我想使用 Fortran 样式索引进行索引,我可以写也许
template <typename T, size_t N, int start>
class customArray
{
public:
T& operator[](const int idx) { return data_[idx+start]; }
private:
std::array<T,N> data_;
}
然后
customArray<double, 7, -3> NameOfArray;
NameOfArray[-3] = 5.2;
NameOfArray[3] = 2.5;
NameOfArray[4] = 3.14; // This is out of bounds,
// despite being a std::array of 7 elements
所以 - 总体思路是“不要从 std::'container class here' 继承”。 我的理解是,这是因为例如 std::vector 没有虚拟析构函数,因此不应该(不能?)多态使用。
还有其他方法可以让我使用std::array、std::vector 等,并“免费”获得它们的功能,同时覆盖特定功能吗?
template<typename T, size_t N>
T& std::array<T,N>::operator[](const int idx) { ... };
可能允许我覆盖运算符,但它不会让我访问有关自定义起点的知识 - 使其完全没有意义。此外,如果我乐观地认为我的所有 customArray 对象都具有相同的偏移量,我可以对该值进行硬编码 - 但随后我的 std::array 已损坏(我认为)。
我该如何解决这个问题? (忽略简单的答案-不要-根据需要写myArray[idx-3])
【问题讨论】:
-
只要你不添加任何应该被析构函数清理的东西(例如非 POD 变量),从 std 向量继承应该是可以的(虽然,可能会有更好的解决您的问题)
-
如果你是从 Fortran 翻译的,你几乎不会多态地使用向量,是吗?然后非虚析构函数参数落下。
-
对不起 - 再次阅读我意识到它读起来好像我在说作为不在这里这样做的理由 - 我的意思是我理解它通常是应该避免的。我明白你的两个观点——也许这是最简单的解决方案。关于“更好的解决方案” - 有什么建议吗? (虽然现在我想这可能是 SO 的题外话)
-
我已经做过很多次了,之后一直很开心。
标签: c++ c++11 inheritance operator-overloading overloading