2

このコードは、g++4.4および'-std= c++0x'で正常にコンパイルされます。

#include <unordered_set>

namespace
{

size_t IntHash ( int i )
{
    return i;
}

bool IntComp ( int i, int j )
{
    return i == j;
}

}

int main ( int argc, char* argv[] )
{
    typedef std::pointer_to_unary_function<int, size_t> CustomHash;
    typedef std::pointer_to_binary_function<int, int, bool>
        CustomComp;

    typedef std::unordered_set<int, CustomHash, CustomComp> DeprecatedSet;

    DeprecatedSet deprecatedSet ( 10, std::ptr_fun ( IntHash ), std::ptr_fun ( IntComp ) );

    deprecatedSet.insert ( 5 );
    deprecatedSet.insert ( 10 );
}

ただし、非推奨のstd::pointer_to_unary_functionとstd::ptr_funを使用したくなかったが、それでも無料の関数を使用するとします。

#include <unordered_set>
#include <functional>

namespace
{

size_t IntHash ( int i )
{
    return i;
}

bool IntComp ( int i, int j )
{
    return i == j;
}

}

int main ( int argc, char* argv[] )
{
    typedef std::unordered_set<int /*, UserDefinedHash?, UserDefinedComparison? */> NewSet;

    NewSet newSet (
        10,
        std::bind ( IntHash, std::placeholders::_1 ),
        std::bind ( IntComp, std::placeholders::_1, std::placeholders::_2 ) );

    newSet.insert ( 5 );
    newSet.insert ( 10 );
}

UserDefinedHashUserDefinedComparisonに何を入力すればよいかわからないため、これはコンパイルされません。

std :: bindには、バインドオブジェクト自体のタイプを定義するメンバータイプがあるようには見えません。

カスタムハッシュ関数と比較を定義する他の方法があることを私は知っています。非推奨の標準ライブラリタイプと関数なしでフリー/クラス関数を使用できるかどうかだけ興味があります。

4

3 に答える 3

10

次を使用できます。

std::unordered_set<int, size_t(*)(int), bool(*)(int, int)> my_set;
my_set s( 10, &IntHash, &IntComp );

そして、を使用するためにstd::bind、あなたは使用することができますdecltypeまたはstd::function

于 2012-10-25T21:18:30.747 に答える
1

std::functionstd::pointer_to_unary_functionなどの代替品です。

typedef std::unordered_set<int, 
                std::function<size_t(int)>,
                std::function<bool(int,int)>> NewSet;

これらのファンクターはすべて、によって非推奨になりましたstd::function。(コメントなどで述べられているように、ここでは通常の関数ポインターが望ましいでしょう。これstd::functionは、あらゆるタイプの呼び出し可能なエンティティを格納することを目的としているためです)。

于 2012-10-25T21:22:40.680 に答える
1

バインドオブジェクトは次の場所に保存できますstd::function

typedef std::unordered_set<int,
    std::function<size_t(int)>, std::function<bool(int, int)>> NewSet;

NewSet newSet (
    10,
    std::bind ( IntHash, std::placeholders::_1 ),
    std::bind ( IntComp, std::placeholders::_1, std::placeholders::_2 ) );
于 2012-10-25T21:25:30.310 に答える