基础对象和继承对象,用于在C ++中包装stdint变量

时间:2019-02-01 12:18:50

标签: c++ wrapper stdint

我正在为使用Sloeber(Eclipse的Arduino插件)的AVR项目重构一些C ++代码。该项目具有许多“设置”变量,这些变量存储在EEPROM中,具有上限和下限,需要字符串标签等。这些设置具有不同的整数类型(<select> <option value="">Selecteer</option> <option value="">1000</option> <option value="">43</option> <option value="">5356</option> <option value="">22</option> <option value="">6</option> </select> uint8_t等),以及我希望包装器可以包含这些类型中的任何一种,并具有从基类继承的某些方法。我还希望能够形成所有设置变量的单个数组,以便可以迭代它们。

一个简单的实现示例如下:

int32_t

然后运行以下命令:

// Base class storing a uint8_t by default
class Base {
  public:
  typedef uint8_t numType;
  numType value = 0;  
};

// Child class changing 'numType' to a uint16_t
class Child: public Base {
  public:
  typedef uint16_t numType;
};

我的意图是Base baseObj; baseObj.value = 123; Child childObj; childObj.value = 12345; 将是childObj.value,而uint16_t仍将是baseObj.value

但是uint8_t的值为childObj.value,因此仍被视为57。对实现此类目标的方式有任何想法吗?

2 个答案:

答案 0 :(得分:1)

您想要的是一种类型的擦除。您可以直接使用std::any(如果您只存储一个值,这会很有意义),也可以自己构建:

class Setting {
 public:
  Setting(std::string description) : _description(description) {}
  virtual ~Setting() = 0;

  std::string getDescription();

  template<typename T>
  T getValue();

 private:
  std::string _description;
};

template <typename T>
class SettingTyped : public Setting {
 public:
  SettingTyped(T value, std::string description)
      : Setting(description), _value(value) {}

  T getValue() { return _value; }

 private:
  T _value;
};

Setting::~Setting() = default;

template<typename T>
T Setting::getValue()
{
    auto* typedSetting = dynamic_cast<SettingTyped<T>*>(this);
    if (!typedSetting)
        throw std::runtime_error("Accessing with wrong type!");
    return typedSetting->getValue();
}

template<typename T>
auto makeSetting(T value, std::string description)
{
    return std::make_unique<SettingTyped<T>>(value, description);
}

bool foo() {
  std::vector<std::unique_ptr<Setting>> settings;
  settings.push_back(makeSetting<int>(3, "a setting"));

  return (settings[0]->getValue<int>() == 3);
}

Demo

您可以使用它来弄清楚如何区分“原型设置”(默认值,界限)和“当前设置值”(实际存储值)。例如,您仍然可以决定是否边界应该在设置类型进行编码(和你创造的各种设置的独立型)或边界是否(潜在的)不同常数每个实例。从您的问题中不清楚此要求。

尤其不清楚您在遍历每个设置时如何期望知道每种设置的正确类型。这里假设你莫名其妙地知道(例如,基于描述?)。

答案 1 :(得分:0)

除非子类具有其他独特行为,否则您只需要将1-exp(-(1+kszi*((0-mu)/szig))^(-1/kszi))作为模板

Base

然后,您可以为所需的不同整数类型创建类型别名:

template<typename T>
struct Base
{
    using numType = T;
    numType value = 0;
};