使用 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
如果它有帮助(我知道它没有)。
有没有一种方法可以在不以 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 */
}
}