如何通过字符串名称访问struct属性? [英] How can I access a struct property by string name?

查看:81
本文介绍了如何通过字符串名称访问struct属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个结构:

typedef struct Tick {
    double open;
    double high;
    double low;
    double close;
    double ema100;
} Tick;

我想访问具有键的属性:

I would like to access a property given a key:

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

std::cout << currentTick[key];

有没有一种方法,而无需使用 std :: map ?我想答案是否定的,但是我只想确定要修改所有内容以使用 std :: map 并增加我的内存需求.

Is there a way to do this without using std::map? I imagine the answer is no, but I just want to be certain before modifying everything to use std::map and increase my memory requirements.

推荐答案

有没有一种方法可以不使用std :: map?

Is there a way to do this without using std::map?

只要您愿意使用一系列层叠的 if-else 语句,就可以做到.

As long as you are willing to live with a series of cascading if-else statements, you can do that.

我会质疑设计.

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

You can get there partially using tag based member variables. Sample working example:

#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);
      }

};


int main()
{
   Tick t;
   t[OpenTag()] = 12.345;
   std::cout << t[OpenTag()] << std::endl;
}

输出:

12.345

这篇关于如何通过字符串名称访问struct属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆