使用for_each打印复杂对象

时间:2016-05-25 15:38:29

标签: c++

我有一个看起来像这样的复杂对象:

struct A
{
    int a;
}

struct B
{
    int b;
    vector<A> vecA;
}

我目前按以下方式打印B的矢量:

struct PrintStruct
{
    ostream &ostream_;
    PrintStruct(ostream &stream) : ostream_(stream) {}

    void operator()(const A& elementA)
    {
        ostream_ << elementA.a;
    }

    void operator()(const B& elementB)
    {
        ostream_ << elementB.b;
        for_each(elementB.vecA.begin(), elementB.vecA.end(), (*this));
    }
}

void print()
{
    vector<B> vecB;
    for_each(vecB.begin(), vecB.end(), PrintStruct(cout));
}

这一定是最好的方法吗?我的主要关注点是在函子本身内调用(*this)中的for_each。这样做安全吗?我认为应该如此,但我不确定是否会产生任何意想不到的后果?

2 个答案:

答案 0 :(得分:0)

  

我的主要关注点是在函子本身内调用(*this)中的for_each。这样做安全吗?

一般无法回答,但在您的情况下,这是安全的。

for_each的调用会复制PrintStruct对象并使用它。副本的ostream_成员将引用与原始ostream_的{​​{1}}成员相同的对象。应该没有问题。

答案 1 :(得分:-1)

我坚信for_each大部分已经过时了。与范围循环相比,我认为它没有任何好处。代码实际上看起来更干净,更直接,在使用时不需要特殊的classess或lambdas:

void print()
{
    vector<B> vecB;
    for(const auto& elem : vecB) {
       std::cout << elem;
    }
}