2016-04-25 12 views
0

ハッシュ ()(FOO)の真ん中に余分な括弧を追加し、この見た:上記のコードでは How to specialize std::hash<Key>::operator() for user-defined type in unordered containers? は、なぜ私は私のクラスハッシュ可能なのものを作るしようとしています

namespace std { 
    template <> struct hash<Foo> 
    { 
    size_t operator()(const Foo & x) const 
    { 
     /* your code here, e.g. "return hash<int>()(x.value);" */ 
    } 
    }; 
} 

を、すべてが正常に動作します。しかし、私はそのメカニズムをよりよく理解しようとしています。

はなぜhash<int>()(...)の真ん中に括弧の余分なペアを追加する必要がありますか?それは醜く見えます。それだけhash<int>(...)になるように、なぜ我々はそれを設計することはできませんか?

答えて

3

hash<int>()(...)の真ん中に余分な括弧を追加する必要があるのはなぜですか?

hash<int>はクラスなので、コールオペレータを適用する前にクラスのインスタンスが必要です。

hash<int>() 

インスタンスの場合、および;

hash<int>()(...) 

これを呼び出すには

hash<int>(...)になるように設計できないのはなぜですか?

いくつかの理由がありますが、最も注目すべき点は、クラステンプレートを部分的に特殊化できる点です。関数テンプレートを完全に特殊化することができます。

それは関数のように振る舞うタイプを期待する多くの標準ライブラリのアルゴリズムとコンテナがあり、また慣用であるが、必ずしも機能しないかもしれません。 Functorの使用はそれを可能にします。

+0

だから、要するに、それは無表情で非自明なすごみ、その結果、C++の混乱や剛性の構文からさらに別の巨大な抽象化リークです。 –

+0

笑(例えば、試料中の一時的なように)名前付きインスタンスせずに使用した場合、それが面倒を見ません。 – Niall

+2

削ら、私は常にC++のための特定の親和性を持つことになります、と私は確かにそれはそれは方法です(とその理由さえも悪いことではありませんいくつかの点で)、私はもっともっと重要なの感じている_why_理解しながら、それは時間がたつにつれて起こります。人生は短すぎると思う。 –

関連する問題