在C ++中使用最小类型歧义

时间:2012-01-23 20:49:43

标签: c++ types operators abstraction

我的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]
}

理想情况下,我可以迭代,或提供某种下一个函数,但要做到这一点,要么:它必须将它的变量存储在一个只能包含一个已知类型的数组中,否则它将提供下一个只能返回一个已知类型的函数。

我正试图找到一种方法,我可以抽象这个概念,这样我就可以在不知道每个值的类型的情况下迭代某些类型的东西。

3 个答案:

答案 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:对不起,如果这不是你想要的,你的问题有点难以理解,所以我只是觉得我会抓住它:)