将两个变量关联起来一起更改
Relate two variables to change together
是否可以将两个要更改的变量关联在一起?
示例:
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#事件。
我不知道你是否可以使用这种语法,但你可以使用以下语法:
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())。据我所知,没有其他方法可以同时改变两个向量。
您可以编写一个包含事件的包装器,类似于:
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;
}
使用模板类和函数,使输入成为泛型,并在作为参数传递时转换输入。
#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
方法中进行。
尽管运算符()的转移不是一个非常符合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;
}
相关文章:
- std::vector的包装器,使数组的结构看起来像结构的数组
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 关联容器的下界复杂性:成员函数与非成员函数
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- 将大括号括起来的初始值设定项列表作为结构返回
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- std::future_error:无关联状态
- 查找自动生成键并具有线性内存消耗的小型关联数组
- 将 SDL2 与 CMake 链接起来
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 如何在 OpenCV 中将图像与另一个图像相关联
- 删除提升存档对象也会删除与其关联的流?
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- 尽管一切看起来都很好,但值不会交换
- 如何用java将文件与程序关联起来
- 如何将更改后的行与C代码的git存储库中的函数关联起来
- 将两个变量关联起来一起更改
- 在C++中,是否有一种将元数据与函数关联起来的整洁方法
- 如何在没有面向对象的情况下将值和功能关联起来
- 如何创建一个将模板对象与自己的模板列表关联起来的方法?