这个有点过时,但我想我会问的。我花了6个小时寻找解决方案,但没有找到任何适用的解决方案。我有一种情况,主代码的子模块将被类似的版本通过重新编译来替换。例如:
#include <iostream>
// g++ -std=c++1z -o list *.cpp
class Foo
{
public:
std::string funcA() {
// Do important stuff
int choice = 0;
switch(choice){
case 0:
return "KeywordX";
break;
case 1:
return "KeywordY";
break;
case 2:
return "KeywordZ";
break;
}
}
std::string funcB() {
std::string val1 = std::string(__func__) + "-KeywordY";
std::string val2 = std::string(__func__) + "-KeywordZ";
std::string val3 = std::string(__func__) + "-KeywordQ";
// Do other important stuff
int choice = 1;
switch(choice){
case 0:
return val1;
break;
case 1:
return val2;
break;
case 2:
return val3;
break;
}
}
};
int main ()
{
Foo foo;
printf("funcA = %sn", foo.funcA().c_str());
printf("funcB = %sn", foo.funcB().c_str());
}
在上面的代码示例中,主代码将被赋予一个新版本的类Foo来执行唯一处理,并且它将始终具有相同的函数名称列表(如funcA、funcB(,但可能有50个或更多。函数将执行一些处理,然后返回一个适当的关键字,如funcA所示("选项"是处理的结果(,主代码将对此进行响应。主代码被提供了一个UML文件,其中列出了关键字和适当的响应。
这里的问题是,Foo类可能有一个或多个拼写错误,或者某个特定函数可能返回一个对其无效的关键字,而主代码在某个随机事件集导致返回该关键字之前不会知道这一点。因此,在代码启动时,有一种方法可以知道可能返回的所有关键字的列表(按函数(,这样就可以将其与UML文件进行比较,并引发错误。funcB示例解决了"by function"问题,但仍然无法在启动时访问它。
理想情况下,按函数排序的所有关键字的列表/映射会很好,但即使所有这些信息都连接到一个字符串中,也可以在启动时进行解析。
是的,每次返回都会引用关键字的主列表,这将解决"拼写错误"问题,但不能解决选择错误关键字的问题。
谢谢你的想法。
您可以强制要求函数可以返回的所有内容必须事先列出。通过一些巧妙的操作,这个列表是可以访问的:
示例:https://godbolt.org/z/frMEWo