Я хотел бы обмениваться числовой информацией очень общим c способом.
- Поддерживаются любые базовые c типы данных, такие как 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);
}
но я застрял с арифметикой c операций, потому что функции не могут быть перегружены на основе их возвращаемых типов.
Есть какие-либо предложения по реализации такого обобщенного c типа данных?
В Python
signals_old = [0, 0.]
signals_new = [1, 100.]
signals_delta[0] = signals_old[0] - signals_new[0]
выполнит свою работу.
Интересно, возможно ли это вообще в C ++?