【问题标题】:Iterate through struct variables遍历结构变量
【发布时间】:2011-01-13 10:01:21
【问题描述】:

我想获得一个结构变量的迭代器,以根据枚举 ID 在运行时设置一个特定的变量。例如 -

struct {
char _char;
int _int;
char* pchar;
};

enum {
_CHAR, //0
_INT,  //1
PCHAR  //2
};

int main()
{
    int i = 1; //_INT
    //if i = 1 then set variable _int of struct to some value.
}

你可以在没有 if/else 或 switch case 语句的情况下做到这一点吗?

【问题讨论】:

    标签: c++ iterator


    【解决方案1】:

    不,C++ 不直接支持这一点。

    但是,您可以使用boost::tuple 做一些非常相似的事情:

    enum {
    CHAR, //0
    INT,  //1
    DBL   //2
    };
    
    tuple<char, int, double> t('b', 1, 3.14);
    
    int i = get<INT>(t);  // or t.get<INT>()
    

    您可能还想看看boost::variant

    【讨论】:

      【解决方案2】:

      C++ 不支持这个。要遍历结构成员,您需要某种方式来了解结构成员是什么。已编译的 C++ 程序不包含此信息。对他们来说,结构只是字节的集合。

      像 C#(实际上是任何 .NET)和 Java 这样的语言可以做到这一点,因为它们将结构信息(反射信息)与程序一起存储。

      如果您真的非常渴望此功能,您可以尝试通过解析编译器创建的符号文件来实现此功能。然而,这是非常先进的,不太可能值得付出努力。

      【讨论】:

        【解决方案3】:

        不。在 C++ 中,您通常对枚举执行以下操作:

        enum VarTypes {
         vtChar = 0,
         vtInt,
         vtDouble,
        
         vtFirst = vtChar,
         vtLast = vtDouble
        };
        

        你仍然需要一个 switch 块来设置结构上的成员。如果您觉得如此倾向,请查看 Microsoft 代码中的一些 Variant 实现。这有点像你正在做的事情。

        【讨论】:

          【解决方案4】:

          没有。 C 和 C++ 不允许这样做。

          你必须 de if/else 或 switch/case 语句。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-21
            • 1970-01-01
            • 1970-01-01
            • 2014-11-14
            • 2019-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多