【问题标题】:Using minimal type ambiguity in C++在 C++ 中使用最小的类型歧义
【发布时间】:2012-01-23 20:49:42
【问题描述】:

我的 C++ 程序中有一个数据结构,它有一些“向量”类型的属性(由我定义)和一些“双精度”类型的属性。在我的代码的另一个地方,我非常希望能够遍历这个数据结构,并对每个值执行相同的算术运算。我需要的运算符是为 Vector 定义的,因此对于 Vector 类型和 double 类型,我需要执行的代码实际上看起来是一样的。

如果可能的话,我想避免遍历“向量值”,然后分别遍历“双值”。

我意识到这对 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]
}

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

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

【问题讨论】:

  • 这有点含糊。给我们一些更具体的东西。我们有一个内置的编译时语言,所以它可能取决于你想要做什么。
  • 您将如何“遍历double 值”?它们是否存储在某种数据结构中?确实,请更具体一些,或许可以提供类定义的相关部分。

标签: c++ types operators abstraction


【解决方案1】:

您可能需要考虑Boost.Fusion。它允许您将类型转换为编译时序列,然后您可以在其中使用编译时扩展 foreach 为每个元素调用适当的函子。

【讨论】:

【解决方案2】:

您的向量类型是否允许多维?如果是这样,您可以使用一维向量作为内部类型 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;
}

当然,如果您有适用于特定维度向量的特殊优化或功能,您可以两者都做。

我想我的真正意思是你应该将双精度数解释为一维向量。

【讨论】:

  • 这是一个我会考虑的选项,但我希望在我不是绝对需要时避免 Vector 的类开销。不过我可能最终会这样做。
【解决方案3】:

向量像数组一样使用连续内存,因此假设您的双精度数在数组中,您可以以相同的方式迭代两者。您可以使用函数模板将它们一般地对待:

template <typename T>
void DoOperationOnSequence(size_t maxIndex, const T& container) {
    for (int i = 0; i < maxIndex; ++i) {
        //Do something with container[i];
    }
}

这应该可以正常工作,假设你的双打是连续的(一个接一个地在内存中不中断)。

PS:抱歉,如果这不是你要找的,你的问题有点难以理解,所以我只是想我会尝试一下:)

【讨论】:

  • 感谢您的宝贵时间;如果您想看一下,我添加了一些更具体的细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多