【问题标题】:Iterable container with generic datatype in C++C ++中具有通用数据类型的可迭代容器
【发布时间】: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


【解决方案1】:

您可以使用变体。 有关详细信息,请参阅此链接,可能会对您有所帮助。 https://en.cppreference.com/w/cpp/utility/variant

【讨论】:

  • 我想如果我做算术,我必须回退到一个特定的数据类型,如in this example。我想隐藏内部数据类型,直到最后进行序列化。
  • 在这种情况下使用带有类型参数的函数模板。声明带类型参数的函数模板的格式为:template function_declaration;模板 函数声明; .类似的可以在:cplusplus.com/doc/oldtutorial/templates
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2016-05-09
  • 2021-11-25
  • 2020-08-30
  • 2012-11-18
  • 2011-03-02
  • 1970-01-01
相关资源
最近更新 更多