Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;:使用X宏在类内定义枚举和字符串数组? 使用C++(VisualStudio)。我正在试图找到一种将枚举转换为字符串的解决方案。我遇到了X宏(),这似乎是一个合理的解决方案,但我很难让它在类中工作。我看到的所有示例都显示了类之外定义的所有内容 // ColorNames.h X(Red, "Red"), X(Blue, "Blue"), ... // MyClass.h class MyClass { public: MyClass(); virtual ~MyClass(); #define X(a, b) a enum Colors { #include "ColorNames.h" }; #undef X #define X(a, b) b char *colorNameStrings_[] = { #include "ColorNames.h" }; #undef X }_C++_String_Enums - Fatal编程技术网

c++;:使用X宏在类内定义枚举和字符串数组? 使用C++(VisualStudio)。我正在试图找到一种将枚举转换为字符串的解决方案。我遇到了X宏(),这似乎是一个合理的解决方案,但我很难让它在类中工作。我看到的所有示例都显示了类之外定义的所有内容 // ColorNames.h X(Red, "Red"), X(Blue, "Blue"), ... // MyClass.h class MyClass { public: MyClass(); virtual ~MyClass(); #define X(a, b) a enum Colors { #include "ColorNames.h" }; #undef X #define X(a, b) b char *colorNameStrings_[] = { #include "ColorNames.h" }; #undef X }

c++;:使用X宏在类内定义枚举和字符串数组? 使用C++(VisualStudio)。我正在试图找到一种将枚举转换为字符串的解决方案。我遇到了X宏(),这似乎是一个合理的解决方案,但我很难让它在类中工作。我看到的所有示例都显示了类之外定义的所有内容 // ColorNames.h X(Red, "Red"), X(Blue, "Blue"), ... // MyClass.h class MyClass { public: MyClass(); virtual ~MyClass(); #define X(a, b) a enum Colors { #include "ColorNames.h" }; #undef X #define X(a, b) b char *colorNameStrings_[] = { #include "ColorNames.h" }; #undef X },c++,string,enums,C++,String,Enums,IDE阻塞在*colorNameStrings_[]=…行,我想是因为您无法初始化头文件中的数据成员变量?如何使其工作?使用这样的结构 struct convert { std::map<MyEnum, std::string> mapping; convert() { mapping[SOME_ENUM_VALUE] = "SomeValue"; // etc to fill map }

IDE阻塞在
*colorNameStrings_[]=…
行,我想是因为您无法初始化头文件中的数据成员变量?如何使其工作?

使用这样的结构

struct convert
{
     std::map<MyEnum, std::string> mapping;

     convert() 
     { 
          mapping[SOME_ENUM_VALUE] = "SomeValue"; 
          // etc to fill map
     }

     std::string operator()(MyEnum enum)
     {
         return mapping[enum];    
     }

};
使用这样的结构

struct convert
{
     std::map<MyEnum, std::string> mapping;

     convert() 
     { 
          mapping[SOME_ENUM_VALUE] = "SomeValue"; 
          // etc to fill map
     }

     std::string operator()(MyEnum enum)
     {
         return mapping[enum];    
     }

};

<>而不是使用X-Ma宏,考虑使用。代码生成宏的初始一次性定义需要一些工作,但最终结果要干净得多,并且更易于重用


我提供了一个通用的、基于预处理器的EnUM到字符串名称转换的基本实现,在对

的回答中,而不是使用X-Ma宏,考虑使用。代码生成宏的初始一次性定义需要一些工作,但最终结果要干净得多,并且更易于重用


在回答

问题时,我提供了一个基于Boost.Preprocessor的通用枚举到字符串名称转换的基本实现。问题是不能在类定义中初始化非静态常量

您可能必须这样做:

// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();

    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X

    static const char * colorNameStrings_[];
};
在.cpp文件中:

// MyClass.cpp
#include "MyClass.h"

#define X(a, b) b
const char * MyClass::colorNameStrings_[] = {
    #include "ColorNames.h"
};
#undef X

问题是不能在类定义中初始化非静态常量

您可能必须这样做:

// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();

    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X

    static const char * colorNameStrings_[];
};
在.cpp文件中:

// MyClass.cpp
#include "MyClass.h"

#define X(a, b) b
const char * MyClass::colorNameStrings_[] = {
    #include "ColorNames.h"
};
#undef X

那是荒谬的冗长。还有,为什么要在函数可以使用的时候使用结构?@Etienne,这正是我过去的做法,当我有大量的枚举需要转换时。使用结构的好处是,你可以在更广泛的范围内定义它们。对于一个函数,您被限制在函数内联和完全在头中。X宏试图解决的基本问题是程序员必须记住保持枚举和std::map同步。这是荒谬的冗长。还有,为什么要在函数可以使用的时候使用结构?@Etienne,这正是我过去的做法,当我有大量的枚举需要转换时。使用结构的好处是,你可以在更广泛的范围内定义它们。对于一个函数,您被限制在函数内联和完全在头中。X宏试图解决的基本问题是程序员必须记住保持枚举和std::map同步。我的目标是实现枚举到字符串的映射。我相信,X宏的思想是帮助保证映射保持同步。我的目标是实现枚举到字符串的映射。我相信X宏的思想是帮助保证映射保持同步。