Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串键哈希的编译时解析_C++ - Fatal编程技术网

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无序映射,我甚至不知道这是否可行。

编译时字符串已经讨论过


也许不是答案本身,但(希望)是一个有用的提示。 它不仅在您的情况下关于无序映射,而且关于您的键, const char */COD>实际上并不意味着编译时字符串,一般情况下,您会考虑更改密钥类型吗?让我们考虑<代码> EnUM <代码> -ED键(并且非常不是最佳二次搜索,对不起):


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