生成链式 else if 的宏

问题描述 投票:0回答:1

使用 X 宏使用模块外提供的列表来保持几个不同的事物同步。

其中一部分涉及创建 else/if 链来验证字符串。

我目前正在做这个:

if (0) {
   // this will never run, and be compiled out
}
#define X(name) else if (some_thing == #name) { // do thing based on name... }
   MY_LIST
#undef X
else {
   // Report unrecognized string...
}

但对我来说感觉有点难看(我不太喜欢不可执行的

if(0) {}
)。

我考虑过使用

switch
语句来做到这一点...

constexpr hash(const char* const str, size_t len, uint64_t init_value)
   // implementation left to imagination of the reader)...

//...

switch(hash(some_thing, len(some_thing))) {
#define X(name) case hash(#name, const_len(#name)): { break; }
   MY_LIST
#undef X
   default: 
   {
      good_thing = false;
      break;
   }
}
// Now that it has been validated as a good string... save it etc.

但我担心碰撞(尽管碰撞的可能性很小)。

有没有一种方法可以在不以

if(0)
开头的情况下执行 if/else 链?

我坚持

std::14
如果它有帮助(我知道它没有)。

c++ if-statement x-macros
1个回答
0
投票

有没有一种方法可以在不以 if(0) 开头的情况下执行 if/else 链?

我不知道有更好的方法来生成带有宏的 if-else 链。我同意它看起来确实有点老套。

但是,这里有另一种方法来验证该字符串是否是从为 C++14 编译的 X-Macros 构建的集合中的一个。如果您认为它更好或不适合您的代码库,请根据您的口味。

#include <set>
#include <string>

void validate_string(std::string some_thing) {
    /* Build the set of strings to test against with X-Macros */
    static const std::set<std::string> validate_set = {
    #define X(name) #name,
    MY_LIST
    #undef X
    };

    if (validate_set.find(some_thing) != validate_set.end()){
        /* Then some_thing is one of the compile time constants */
    }
    
}
© www.soinside.com 2019 - 2024. All rights reserved.