我的C ++程序中有一个数据结构,它有一些类型为'Vector'的属性(由我定义),有些属于'double'类型。在我的代码中的另一个地方,我非常希望能够遍历这个数据结构,并对每个值执行相同的算术运算。我将需要的运算符是为Vector定义的,因此对于Vector类型和double类型,我需要做的代码看起来是一样的。
如果可能的话,我想避免迭代'Vector values',然后分别迭代'double values'。
我意识到这对C ++的严格打字造成了压力,但有没有什么好方法可以实现这个目标呢?
编辑:
现在,我正在做一些这样的例行操作:
e.values.vel = k0[i].vel + k1[i].vel * c_1;
e.values.acc = k0[i].acc + k1[i].acc * c_1;
....
(e和k0 [i]是同一类型)
现在,唯一阻止我推广e类型的事实是,某些e的值可能是向量,有些可能是双倍的,理想情况下,此代码将处理此类型的不同对象,这些对象可能具有不同的数字或各种价值观。我想要的是:
for (int j = 0; j < e.values.size(); j ++)
{
e.values[j] = k0[i].values[j] + k1[i].values[j]
}
理想情况下,我可以迭代,或提供某种下一个函数,但要做到这一点,要么:它必须将它的变量存储在一个只能包含一个已知类型的数组中,否则它将提供下一个只能返回一个已知类型的函数。
我正试图找到一种方法,我可以抽象这个概念,这样我就可以在不知道每个值的类型的情况下迭代某些类型的东西。
答案 0 :(得分:1)
你的矢量类型是否允许多维度?如果是这样,你可以使用1-D向量作为内在类型double的包装,然后迭代向量。
class Vector {
public:
Vector(int dimensions = 1);
...
double& operator[](int index);
};
或者,您可以编写一个Vector抽象类,然后只实现您想要的维度:1-,2,3-d矢量很常见。
class Vector {
public:
...
Vector operator+(const Vector& rhs) const = 0;
...
};
class Vector1D : Vector {
public:
...
vector operator+(const Vector& rhs) const;
}
class Vector2D : Vector {
public:
...
vector operator+(const Vector& rhs) const;
}
class Vector3D : Vector {
public:
...
vector operator+(const Vector& rhs) const;
}
当然,如果您有适用于特定维度向量的特殊优化或功能,则可以同时执行这两项操作。
我想我真正要说的是你应该将双打解释为一维向量。
答案 1 :(得分:1)
您可能需要考虑Boost.Fusion。它允许您将类型转换为编译时序列,然后您可以使用编译时扩展foreach为每个元素调用适当的函子。
答案 2 :(得分:0)
向量使用连续内存,就像数组一样,所以假设你的双精度数组在一个数组中,你可以用相同的方式迭代。您可以使用函数模板来一般地处理它们:
template <typename T>
void DoOperationOnSequence(size_t maxIndex, const T& container) {
for (int i = 0; i < maxIndex; ++i) {
//Do something with container[i];
}
}
这应该可以正常工作,假设你的双打是连续的(一个接一个不间断的记忆)序列。
PS:对不起,如果这不是你想要的,你的问题有点难以理解,所以我只是觉得我会抓住它:)