Итерируемый контейнер с общим c типом данных в C ++ - PullRequest
0 голосов
/ 06 мая 2020

Я хотел бы обмениваться числовой информацией очень общим 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 ++?

1 Ответ

0 голосов
/ 06 мая 2020

вы можете использовать вариант. Обратитесь к этой ссылке для получения подробной информации, возможно, это поможет вам. https://en.cppreference.com/w/cpp/utility/variant

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...