C++ 字符串键哈希的编译时解析
我正在编写一个用于从预定义元素字符串表生成位掩码的类:C++ 字符串键哈希的编译时解析,c++,C++,我正在编写一个用于从预定义元素字符串表生成位掩码的类: const std::unordered_map<std::string, int> flagMap { { "bananas", 0x1 }, { "apples", 0x2 }, { "oranges", 0x4 }, { "pears", 0x8 }}; int fruitMask(std::string & fruitName) { if(flagMap.count(fruitName) > 0)
const std::unordered_map<std::string, int> flagMap
{ { "bananas", 0x1 }, { "apples", 0x2 }, { "oranges", 0x4 }, { "pears", 0x8 }};
int fruitMask(std::string & fruitName)
{
if(flagMap.count(fruitName) > 0)
return flagMap.at(fruitName);
else
return 0;
}
int fruitMask(const char * fruitName)
{
if(flagMap.count(fruitName) > 0)
return flagMap.at(fruitName);
else
return 0;
}
int fruitMask(std::vector<std::string> fruitNames)
{
int result = 0;
for(auto it=fruitNames.begin(); it!=fruitNames.end(); ++it)
{
if(flagMap.count(*it) > 0)
result = result | flagMap.at(*it);
}
return result;
}
int fruitMask(std::initializer_list<const char*> fruitNames)
{
int result = 0;
for(auto it=fruitNames.begin(); it!=fruitNames.end(); ++it)
{
if(flagMap.count(*it) > 0)
result = result | flagMap.at(*it);
}
return result;
}
这不会编译,因为flagMask()不是constexpr,有什么方法可以让它工作吗?这需要一个constexpr无序映射,我甚至不知道这是否可行。编译时字符串已经讨论过
也许不是答案本身,但(希望)是一个有用的提示。 它不仅在您的情况下关于无序映射,而且关于您的键,
at-O1及以上我认为这是不可能的。您要求在编译时进行太复杂的计算。编译器不打算执行任何计算。它不仅与无序映射有关,而且还与您的密钥有关,const char在一般情况下并不意味着编译时间字符串,您是否考虑更改密钥类型?
constexpr int mask = flagMask({"oranges", "bananas"});
#include <utility>
enum class keys : char
{
foo,
bar,
baz,
lol
};
static constexpr std::pair<keys, int> flagMap[] = {
{keys::foo, 42},
{keys::bar, 24},
{keys::baz, 100500},
{keys::lol, 15234}
};
static constexpr int sum(std::initializer_list<keys> target)
{
int res{0};
for (auto key: target) {
for (int i = 0; i < 4; ++i)
{
res += (flagMap[i].first == key) ? flagMap[i].second : 0;
}
}
return res;
}
int main()
{
return sum({keys::foo, keys::baz});
}
mov eax, 100542
ret