假设我们有一些命名的枚举:
enum MyEnum {
FOO,
BAR = 0x50
};
Run Code Online (Sandbox Code Playgroud)
我搜索的是一个脚本(任何语言),它扫描我项目中的所有标题,并生成一个标题,每个枚举一个函数.
char* enum_to_string(MyEnum t);
Run Code Online (Sandbox Code Playgroud)
以及类似这样的实现:
char* enum_to_string(MyEnum t){
switch(t){
case FOO:
return "FOO";
case BAR:
return "BAR";
default:
return "INVALID ENUM";
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题确实与typedefed枚举和未命名的C风格枚举有关.有人知道这个吗?
编辑:解决方案不应该修改我的源,除了生成的函数.枚举是在API中,因此使用迄今为止提出的解决方案不是一种选择.
是否可以通过执行以下操作将字符串转换为变量(反之亦然):
makeVariable("int", "count");
Run Code Online (Sandbox Code Playgroud)
要么
string fruit;
cin >> fruit; // user inputs "apple"
makeVariable(fruit, "a green round object");
Run Code Online (Sandbox Code Playgroud)
然后能够通过执行以下操作来访问它:
cout << apple; //a green round object
Run Code Online (Sandbox Code Playgroud)
提前致谢!
如果标题不清楚,我会尽量澄清我的要求:
想象一下,我有一个名为counter的变量,我知道我可以通过以下方式看到它的当前值:
std::cout << counter << std::endl;
Run Code Online (Sandbox Code Playgroud)
但是,假设我有很多变量,我不知道在运行之前我想要查看哪些变量.
有没有人知道我可以通过使用其名称来获取变量值的方法,例如:
std::cout << valueOf("counter") << std::endl;
Run Code Online (Sandbox Code Playgroud)
我觉得能够做到这一点可能会使调试大型复杂项目变得更容易.
在此先感谢您的时间.
更新:所提供的所有答案都是有效且有用的,但重点是C++中不存在反射(并且在阅读建议的链接之后很明显为什么).
我正在扩展我们的内部调试库,而且我遇到了一个奇怪的问题.我想输出一个变量名作为字符串.从本网站的其他地方,我发现可以在文件中使用宏来执行此操作:
#define VarToStr(v) #v
...
printf("%s\n", VarToStr(MatName));
Run Code Online (Sandbox Code Playgroud)
这输出MatName.但现在让我们通过跨文件的函数来尝试这个(Matrix是一个定义的类型):
// DebugHelpers.h
#define VarToStr(v) #v
...
void PrintMatrix(const Matrix &InputMat)
{
printf("%s\n", VarToStr(InputMat));
... // output InputMat contents
}
// DataAnalysis.cc
#include DebugHelpers.h
...
void AnalysisSubProgram342()
{
Matrix MatName;
...
PrintMatrix(MatName);
}
Run Code Online (Sandbox Code Playgroud)
这输出InputMat,而不是MatName.另一个文件中的函数如何从调用文件中获取变量名?
虽然更复杂的解决方案(包装类等)对更大的社区有用,但我的实现需要最小化对预先存在的代码/类的影响.
更新:
受天顶评论的启发,我为了比较而实施了他提出的两个解决方案,并且快速完成了工作.该宏适用于简单输出,而该功能允许更复杂的工作(以及类型检查/重载).我不知道预处理器宏可能如此复杂.我会记住两者以备将来使用.谢谢 !