亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編譯時間字符串散列

編譯時間字符串散列

C++
汪汪一只貓 2019-09-19 16:42:30
我在幾個不同的地方讀過,使用C ++ 11的新字符串文字,可以在編譯時計算字符串的哈希值。然而,似乎沒有人準備出來說它將是可能的或如何完成。這可能嗎?操作員會是什么樣子?我特別感興趣的是這樣的用例。void foo( const std::string& value ){   switch( std::hash(value) )   {      case "one"_hash: one(); break;      case "two"_hash: two(); break;      /*many more cases*/      default: other(); break;   }}注意:編譯時哈希函數不必像我編寫的那樣完全。我盡力猜測最終解決方案的樣子,但meta_hash<"string"_meta>::value也可能是一個可行的解決方案。
查看完整描述

3 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

至少在我閱讀§7.1.5/ 3和§5.19時,以下內容可能是合法的:


unsigned constexpr const_hash(char const *input) {

    return *input ?

        static_cast<unsigned int>(*input) + 33 * const_hash(input + 1) :

        5381;

}

這似乎遵循§7.1.5/ 3中的基本規則:


形式是:“回歸表達”;

它唯一的參數是一個指針,它是一個標量類型,因此是一個文字類型。

它的返回是unsigned int,它也是標量(因此是字面的)。

沒有隱式轉換為返回類型。

有一些問題是*inputs 是否涉及非法左值轉換,我不確定我是否理解§5.19/ 2/6/2 1和§4.1中的規則以確保這一點。


從實際的角度來看,這個代碼被(例如)g ++接受,至少可以追溯到g ++ 4.7.1。


用法如下:


switch(std::hash(value)) {

    case const_hash("one"): one(); break;

    case const_hash("two"): two(); break;

    // ...

    default: other(); break;

}

為了符合§5.19/ 2/6/2的要求,您可能需要執行以下操作:


// one of the `constexpr`s is probably redundant, but I haven't figure out which.

char constexpr * constexpr v_one = "one"; 


// ....


case const_hash(v_one): one(); break;

我正在使用額外的'斜線'數字來指代未編號的子彈點,所以如果是第5.19 / 2節中的第六個要點,這是內部的第二個要點。我想我可能要和Pete Becker討論是否可以在層次結構中添加某種數字/字母/羅馬數字來識別這樣的部分......


查看完整回答
反對 回復 2019-09-19
  • 3 回答
  • 0 關注
  • 527 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號