c++ 动态成员指针数组

uubf1zoe  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(168)

是否可以创建一个动态数组来保存结构中每个变量的名称?

typedef struct dataSave {
    uint8_t nb;
    bool state;
    uint16_t dataIRArray[512];
} dataSave_t;

dataSave_t mysave;

template <typename T>
struct config_t {
    auto T::*var;
    char* name;
};

const config_t<dataSave_t> config[] = {
    {&dataSave_t::nb, "nb"},
    {&dataSave_t::state, "state"},
    {&dataSave_t::dataIRArray, "dataIRArray"}
};

结构变量的类型不同,并且总是生成错误:
错误:使用占位符“auto”声明了非静态数据成员
我需要创建类似于动态遍历JSON并转换JSON数据的东西,只需将其添加到配置列表中即可。

xqnpmsa8

xqnpmsa81#

我猜你想要这样的东西:

template <typename owner>
  struct desc_base
  {
      virtual ~desc_base() = default;
      virtual std::string to_string(const owner&) = 0;
      virtual void from_string(owner&, std::string_view) = 0;
      const std::string name;
      desc_base(std::string_view name) : name(name) {}
  };
  
  template <typename owner, typename member>
  struct desc : desc_base<owner>
  {
      member owner::*ptr;
      std::string to_string(const owner& o) override { return my_to_string(o.*ptr); }
      void from_string(owner& o, std::string_view s) override { my_from_string(s, o.*ptr); }
      desc (member owner::*ptr, std::string_view name) : desc_base<owner>(name), ptr(ptr) {}
  };
  
  template <typename owner, typename member>
  std::unique_ptr<desc<owner, member>>
  make_desc(member owner::*ptr, std::string_view name) { return std::make_unique<desc<owner, member>>(ptr, name); }
  
  const std::unique_ptr<desc_base<dataSave_t>> config[] {
      make_desc(&dataSave_t::nb, "nb"),
      make_desc(&dataSave_t::state, "state"),
      make_desc(&dataSave_t::dataIRArray, "dataIRAArray")
  };

它使用基本的多态技术来存储一个基类对象数组(指向基类对象的智能指针),其中所有的实际工作都是由派生对象通过虚函数完成的。在这种情况下,实际工作是from_stringto_string。您可以用执行任何实际工作的函数来替换它们,或者只定义my_to_stringmy_from_string

相关问题