2015-12-24 72 views
1

是否有可能将两个变量关联在一起改变?关联两个变量一起改变

例子:

class foo{ 
public: 
    std::vector<int> v1; 
    std::vector<float> v2; 

    //Imaginary Code here: 
    void on_v2_change(){ 
      std::transform(begin(v2),end(v2),begin(v1),[](auto& item){ return std::round(item);}); 
    } 
} 

int main(){ 
    foo bar; 
    bar.v2.push_back(5.7); 
    //v2={5.4} 
    //v1={5} 
} 

有没有实现以前的一种简单的方法?像Java或C#事件。

+0

是的,通过将这两个变量包含在包含对其他变量的引用的类中。你确定这是你想要做的吗? –

+0

除了导致我问这个问题的原始问题之外,很高兴知道是否可以在C++中执行此操作。顺便说一句,如果您有时间提供关于您提到的方式的答案,那将会很棒并非常感谢。 –

+0

你真的需要'v1'吗? 'v2'的* int-view *似乎可以完成这项工作。 (即使两者都需要编写特定的代码)。 – Jarod42

回答

1

你可以写的事件,类似的包装:

template<typename V> 
class vector_observer 
{ 
    virtual ~vector_observer() = default; 
    virtual void on_push_back(typename V::const_reference value) = 0; 
    virtual void on_clear() = 0; 
    // ... 
}; 

template<typename T> 
class observed_vector 
{ 
private: 
    std::vector<T> vec; 
    vector_observer& obs; 
public: 
    explicit observed_vector(vector_observer& obs) : obs(obs) {} 

    void push_back(const T& value) { vec.push_back(value); obs.on_push_back(value); } 
    void clear() { vec.clear(); obs.on_clear(); } 
    // ... 
}; 

class to_int_vector_observer : public vector_observer<std::vector<float>> 
{ 
public: 
    explicit to_int_vector_observer(std::vector<int>&vec) : vec(vec) {} 

    void on_push_back(float value) override{ vec.push_back(round(value)); } 
    void on_clear() override { vec.clear(); } 

private: 
    std::vector<int>& vec; 
} 
2

我不知道是否可以使用的正是这种语法,但你可以使用以下命令:

class foo { 
    std::vector<int> v1; 
    std::vector<float> v2; 

    public: 
    void push_back(float val) { 
     v1.push_back(std::round(val)); 
     v2.push_back(val); 
    } 
    // .... 

您也可以为其他功能添加类似的功能(如擦除())。据我所知,没有其他方法可以一次更换两个向量。

+0

谢谢,我需要完全同步的解决方案,例如,如果我将v2作为迭代器传递给某个函数,并且它改变了它,我还希望v1也被更改。 –

+2

然后我认为你也必须为你的类实现自定义迭代器。 – thefunkyjunky

0

使用模板类和函数,作为参数传递时进行通用和转换输入。

#include <iostream> 
#include <vector> 

template <class T1, class T2> 
class Stack { 
    private: 
    std::vector<T1> v1; 
    std::vector<T2> v2; 

    public: 
    template<typename T3, typename T4> 
    void push (T3 v, T4 flag) { 
    if(flag) 
     v1.push_back(v); 
    else 
     v2.push_back(v); 
    } 
}; 

int main() { 
    Stack<int,float> stack; 
    stack.push(7,0); 
    stack.push((int)7.5,1); 
} 

或进一步可以修改按规定像float -> int转换可以在push方法,每次使用和设计来完成。

0

尽管运营商的转移()是不是一个解决方案非常符合C++ ...

#include "stdafx.h" 
#include <vector> 

class vectorFloatAndInt : public std::vector<float> 
{ 
public: 
    inline int operator() (unsigned int paramPos) 
    { 
     return std::round((*this)[paramPos]); 
    } 
}; 

int main() 
{ 
    vectorFloatAndInt bar; 
    bar.push_back(5.4); 

    float vf = bar[0]; // == 5.4 
    int vi = bar(0);  // == 5 
    return 0; 
}