如何通过字符串名称访问struct属性?

Cha*_*son 2 c++ vector c++11

我有一个结构:

typedef struct Tick {
    double open;
    double high;
    double low;
    double close;
    double ema100;
} Tick;
Run Code Online (Sandbox Code Playgroud)

我想访问一个给定键的属性:

Tick currentTick = {44.5, 45.1, 44.2, 44.6, 44.255};
std::string key = "ema100";

std::cout << currentTick[key];
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点而不使用std::map?我想答案是否定的,但是我只想确定在修改所有要使用的内容std::map并增加内存需求之前。

Zby*_*000 8

您正在寻找的功能称为反射。本机 C++ 不支持此功能。您可以检查一些第三方库来为您进行反射(但仍然需要大量的手动工作)。

或者另一个选项是(正如您所提到的)使用std::map(或者更确切地说std::unordered_map,因为它会执行得更好)将名称映射到类中字段的 id 或偏移量(指针),然后通过 switch 语句(在前一种情况下)或直接使用指针(在后一种情况下)修改字段值。


R S*_*ahu 5

有没有不使用std :: map的方法吗?

只要您愿意接受一系列级联if-else语句,就可以做到。

我会质疑设计。

您可以使用基于标签的成员变量部分地到达那里。示例工作示例

#include <iostream>

struct OpenTag {};
struct HighTag {};
struct LowTag {};
struct CloseTag {};
struct Ema100Tag {};

struct Tick {

   template <typename Tag> struct Member
   {
      double val;

      operator double () const { return val; }

      operator double& () { return val; }
   };

   struct AllMembers : Member<OpenTag>, 
                       Member<HighTag>,
                       Member<LowTag>,
                       Member<CloseTag>,
                       Member<Ema100Tag> {};

   AllMembers data;

   template <typename Tag>
      double operator[](Tag t) const
      {
         return (Member<Tag> const&)(data);
      }

   template <typename Tag>
      double& operator[](Tag t)
      {
         return (Member<Tag>&)(data);
      }

};
Run Code Online (Sandbox Code Playgroud)
int main()
{
   Tick t;
   t[OpenTag()] = 12.345;
   std::cout << t[OpenTag()] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

12.345
Run Code Online (Sandbox Code Playgroud)