【问题标题】:Why is {} used to access operator() in std::hash?为什么 {} 用于访问 std::hash 中的 operator()?
【发布时间】:2018-02-22 09:10:50
【问题描述】:

在阅读用于 std::unordered_map 的 std::hash 示例时,我注意到 {} 正在访问 operator() 函数。

http://en.cppreference.com/w/cpp/utility/hash

result_type operator()(argument_type const& s) const
{
    result_type const h1 ( std::hash<std::string>{}(s.first_name) );
    result_type const h2 ( std::hash<std::string>{}(s.last_name) );
    return h1 ^ (h2 << 1); // or use boost::hash_combine (see Discussion)
}

这里使用的 {} 代表什么?

【问题讨论】:

  • 我希望 C++ 允许 static operator()s.
  • @DanielH 为什么? C++ 允许静态函数,函数的名称并不重要,不是吗?您希望将状态附加到您调用的函数,这正是仿函数的优势(或用例)
  • @DanielH 这基本上是......返回您选择的类型的构造函数。疯狂。

标签: c++ c++11 hash unordered-map c++-standard-library


【解决方案1】:

std::hash&lt;T&gt; 是一个类型而不是一个函数。

std::hash 的一个实例有一个 operator() 进行哈希处理。

所以std::hash&lt;std::string&gt; 是一种散列类型。 {} 然后创建该类型的实例。 (s.first_name)std::hash&lt;std::string&gt; 上调用 operator()

std::hash<std::string>{}(s.first_name);
^                     ^       ^
|                     |   call operator() on that instance
type of hasher        |
                create an instance of that type

【讨论】:

  • @erip 如果我也这样做,你会给我一个赞成票吗?开个玩笑:P 我实际上是要画类似的东西,但我太慢了
  • @tobi303 如果你添加手绘的红色圆圈,我会投票赞成。
  • 你要求很高,但我也没有动力去做其他事情:P
  • 所以它只是对象的聚合初始化。我从来没有像那样写过它,所以它把我吓坏了。 c ++ 11 en.cppreference.com/w/cpp/language/aggregate_initialization的语法列表中的第二种形式@
  • 类模板,不是类型:-P
【解决方案2】:

std::hash 不是一个函数,而是一个类,更具体地说是一个函子。所以你必须先创建该类的一个对象,然后才能调用它的operator()

【讨论】:

  • 真的是写意吗? :>
  • 看起来很写意。可悲的是,我没有说“仅当”,所以我已经投了赞成票。 ;) 但是 +1 手绘红圈。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2013-04-09
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2010-11-09
  • 2015-03-14
  • 2017-08-15
相关资源
最近更新 更多