关联两个变量以一起更改

时间:2015-12-24 07:32:01

标签: c++ c++11 events

是否可以将两个变量关联在一起?

示例:

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#事件。

4 个答案:

答案 0 :(得分: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);
    }
    // ....

您还可以为其他功能添加类似功能(例如erase())。据我所知,没有其他方法可以同时更改两个向量。

答案 1 :(得分: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 :(得分: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方法按照使用和设计进行转换。

答案 3 :(得分:0)

尽管operator()的转移不是一个非常符合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;
}