首页 > 解决方案 > 按函数名称列出的关键字的编译时列表

问题描述

这个有点,但我想我会问。我花了 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 = %s\n", foo.funcA().c_str());
  printf("funcB = %s\n", foo.funcB().c_str());
}

在上面的代码示例中,主代码将被赋予一个新版本的类 Foo 来执行唯一的处理,并且它将始终具有相同的函数名称列表(如 funcA、funcB),但可能有 50 个或更多他们。函数会执行一些处理,然后返回适当的关键字,如 funcA 所示('choice' 是处理的结果),主代码将响应。主代码有一个 UML 文件,其中列出了关键字和相应的响应。

这里的问题是 Foo 类可能有一个或多个拼写错误,或者特定函数可能返回一个对其返回无效的关键字,并且主代码不会知道这一点,直到某些随机事件集导致要返回的关键字。所以,最好有办法在代码启动时知道所有关键字的列表,按函数,可能会返回,因此可以将其与 UML 文件进行比较,并引发错误。funcB 示例解决了“按功能”问题,但仍然无法在启动时访问它。

理想情况下,所有关键字的列表/映射,按函数排序会很好,但即使所有这些信息连接到一个字符串,可以在启动时解析也可以。

是的,每次返回都引用的关键字主列表将解决“错字”问题,但不能解决错误关键字的选择。

谢谢你的想法。

标签: c++stringlistcompilation

解决方案


您可以强制必须事先列出该函数可以返回的所有内容。通过一些巧妙的操作,可以访问此列表:

示例: https ://godbolt.org/z/frMEWo


推荐阅读