【发布时间】:2020-05-06 19:26:53
【问题描述】:
我想以一种非常通用的方式交换数字信息。
- 应支持任何基本数据类型,例如 float、int、unsigned short...
- 交换一个容器,以便可以遍历所有元素(编译时已知长度)
- 应该可以更新值
- 不同数组元素之间的基本数学运算(+、-)
- 数据类型应该被序列化
我得到的最接近的是:
#include <iostream>
#include <fstream>
#include <array>
#include <memory>
class BaseSignal
{
public:
BaseSignal() {}
BaseSignal(const BaseSignal &) = delete;
public:
virtual const char* getBinRepr() = 0;
virtual int getLength() = 0;
virtual std::string getDescr() = 0;
virtual void setValue(int) {}
virtual void setValue(float) {}
/* impossible because overloading based on return type is not possible */
//virtual int getValue() {}
//virtual float getValue() {}
};
template <typename T> class Signal: public BaseSignal
{
private:
std::string descr;
public:
T value;
public:
Signal(std::string _descr, T _value)
{
value = _value;
descr = _descr;
}
Signal(const Signal & _signal)
{
value = _signal.value;
descr = _signal.descr;
}
const char * getBinRepr()
{
return (const char*) &value;
}
int getLength()
{
return sizeof(value);
}
std::string getDescr()
{
return descr;
}
void setValue(int _value) {value = (T)_value;}
void setValue(float _value) {value = (T)_value;}
};
int main()
{
std::array<std::unique_ptr<BaseSignal>, 2> signals_old;
std::array<std::unique_ptr<BaseSignal>, 2> signals_new;
std::array<std::unique_ptr<BaseSignal>, 2> signals_delta;
signals_old[0] = std::unique_ptr<BaseSignal>(new Signal<int>("Status", 0));
signals_old[1] = std::unique_ptr<BaseSignal>(new Signal<float>("Temperature", 0.));
signals_new[0] = std::unique_ptr<BaseSignal>(new Signal<int>("Status", 1));
signals_new[1] = std::unique_ptr<BaseSignal>(new Signal<float>("Temperature", 100.));
/* no idea how to do basic maths */
// signals_delta[0]->setValue(signals_old[0]->value-signals_new[0]->value);
}
但我被算术运算困住了,因为函数不能根据它们的返回类型重载。
关于如何实现这种通用数据类型有什么建议吗?
在 Python 中
signals_old = [0, 0.]
signals_new = [1, 100.]
signals_delta[0] = signals_old[0] - signals_new[0]
会做的。
我想知道这在 C++ 中是否可能?
【问题讨论】:
-
“通用数据类型”是什么意思?您想在同一个容器中存储多种类型吗?
-
如果你想要一个可以对数字类型进行元素计算的容器,你看过
std::valarray吗?您只需要添加序列化,这对于这种数据来说是微不足道的。 -
没有理由有2个setValue方法,你只需要
void setValue(T _value) {value = _value;}并且在调用方法时对参数进行转换。当然 get 返回一个 T -
容器应该包含异构类型。像
container= [float,int,short,float]这样的东西会在 Python 中完成。关于2 setValue:基类必须已经定义了这些函数,否则它们不能通过指向抽象基类的指针访问!
标签: c++ arrays templates containers