如何遍历C ++类的变量成员

时间:2013-02-25 20:33:28

标签: c++ loops

我正在尝试对一些变量进行复杂的变量校正(基于各个相位空间中的归一化)对于我正在阅读的一些数据。由于每个校正遵循相同的过程,我想知道是否无论如何都会迭代地执行此操作,而不是自己处理每个变量(因为我需要这个约18-20个变量)。 C ++可以处理这个吗?有人告诉我在python中尝试这个,但我觉得它可以用某种方式用C ++完成......我只是碰壁了!

给你一个想法,给出类似的东西:

class VariableClass{
    public :
      //each object of this class represents an event for this particlular data set 
      //containing the following variables
      double x;
      double y;
      double z;
}

我想按照以下方式做点什么:

for (int i=0; i < num_variables; i++)
{
   for (int j=0; j < num_events; j++)
   {
     //iterate through events
   }
   //correct variable here, then move on to next one
}

提前感谢任何建议!!!

5 个答案:

答案 0 :(得分:2)

我假设您的成员变量不会都具有相同的类型。否则你可以把它们扔进一个容器里。如果您有C ++ 11,那么解决此问题的一种方法是tuple。使用一些template metaprogramming,您可以模拟元组的所有元素的循环。函数std::tie将构建一个元组,引用您可以“迭代”的所有成员,如下所示:

struct DoCorrection
{
    template<typename T>
    void operator()(T& t) const { /* code goes here */ }
};

for_each(std::tie(x, y, z), DoCorrection());
// see linked SO answer for the detailed code to make this special for_each work.

然后,您可以为每个成员变量类型专门化operator()。这将使您自动进行适当的数学运算,而无需手动跟踪类型。

答案 1 :(得分:1)

是的,只需将所有变量放入容器中,例如std::vector

答案 2 :(得分:1)

http://en.cppreference.com/w/cpp/container/vector

我建议花些时间阅读所有std课程。有许多容器和许多用途。

答案 3 :(得分:1)

取自glm(详情为vec3.incl)

template <typename T>
GLM_FUNC_QUALIFIER typename tvec3<T>::value_type & 
tvec3<T>::operator[]
(
    size_type i
)
{
    assert(i < this->length());
    return (&x)[i];
}

这将转化为您的示例:

class VariableClass{
public :
  //each object of this class represents an event for this particlular data
  double x;
  double y;
  double z;

  double & operator[](int i) {
    assert(i < 3);
    return (&x)[i];
  }
}

VariableClass foo();
foo.x = 2.0;
std::cout << foo[0] << std::endl; // => 2.0

如果它只是关于矢量数学的话,我会推荐glm。

答案 4 :(得分:0)

一般情况下,你不能在不依赖于实现定义的东西的情况下迭代成员,比如填充或重新排序具有不同访问限定符的部分(事实上,后面没有编译器 - 但是它是允许的)。

但是,您可以使用记录类型的泛化:std::tuple。迭代一个元组不是直截了当的,但你会发现很多代码可以做到这一点。这里最糟糕的是命名变量的丢失,你可以模仿成员。

如果您使用Boost,您可以使用Boost.Fusion's helper-macro BOOST_FUSION_ADAPT_STRUCT将结构转换为Fusion序列,然后您可以将其与Fusion算法一起使用。