gpt4 book ai didi

c++ - 字符串键控哈希的编译时间解析

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:36 24 4
gpt4 key购买 nike

我正在编写一个用于从预定义元素字符串表生成位掩码的类:

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;
}

当使用这些函数的代码调用 const char*std::initializer_list<const char*> fruitMask 的版本,有什么办法让它在编译时工作吗?

例如:

constexpr int mask = flagMask({"oranges", "bananas"}); 

这不会编译,因为 flagMask() 不是 constexpr,有什么办法让它工作吗?这需要一个 constexpr unordered_map,我什至不知道这是否可能。

最佳答案

讨论了编译时字符串 here


也许本身不是答案,而是(希望)有帮助的提示。它不仅与您的情况下的无序映射有关,而且与您的键有关, const char* 在一般情况下并不真正意味着编译时字符串,您会考虑更改键类型吗?让我们考虑 enum-ed 键(非常不是最佳二次搜索,抱歉):

#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});
}

Demo产量只是

mov     eax, 100542
ret

在 -O1 及以上

关于c++ - 字符串键控哈希的编译时间解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com