在模板中编辑列表而不保存

时间:2017-11-23 09:29:11

标签: c++ list function templates for-loop

我有一个for循环,我想多次使用而不复制并粘贴代码,所以我使用的是模板。 Answer I used for the template. 模板和循环本身按预期工作,但是从for循环中调用的函数内的列表中更改变量不起作用。 如果我在'Test'函数中更改s.Color,它在该函数或示例循环之外没有更改。

那么为什么它不会在循环之外被改变?我怎样才能确保它在循环之外发生变化?

模板:

void Test(TrafficLight s) {
    switch (s.Type) {
    case hfdWeg:
        s.Color = queueCurrent.HoofdwegColor;
        break;
    case zWeg:
        s.Color = queueCurrent.ZijwegColor;
        break;
    case vtPad:
        s.Color = queueCurrent.VoetpadColor;
        break;
    default:
        std::cout << "\nError";
        break;
    }
}

template<typename Func>
inline void do_something_loop(Func f)
{
    for (std::list<TrafficLight>::iterator i = Lichten.begin(); i !=    Lichten.end(); ++i) {
        TrafficLight & s(*i);
        f(s);
    }
}

调用模板:

do_something_loop(Test);

清单:

std::list<TrafficLight> Lichten;

TrafficLight类:

class TrafficLight {
private:
public:
    TrafficLight(TrafficLightType type, TrafficLightColor color = R) {
        Color = color;
        Type = type;
    }
    TrafficLightColor Color;
    TrafficLightType Type;
};

2 个答案:

答案 0 :(得分:5)

我想:

void Test(TrafficLight s) { ... }

应该是:

void Test(TrafficLight& s) { ... }

因为现在您正在编辑副本。

因此需要通过引用传递

答案 1 :(得分:2)

改变这个:

void Test(TrafficLight s)

到此:

void Test(TrafficLight& s)

因为您需要通过引用传递,以便在函数终止后保持更改。

您的代码按值传递参数(它会在s的主体内创建Test()副本