这段代码可以很好地编译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 );
}
这不编译,我假设因为我不确定要为 UserDefinedHash 和 UserDefinedComparison 投入什么。
看起来std :: bind没有定义 bind 对象本身类型的成员类型。
我知道还有其他方法来定义自定义哈希函数和比较,只是好奇是否可以使用自由/类函数而不使用已弃用的标准库类型和函数。
答案 0 :(得分:10)
您可以使用:
std::unordered_set<int, size_t(*)(int), bool(*)(int, int)> my_set;
my_set s( 10, &IntHash, &IntComp );
要使用std::bind
,您可以使用decltype
或std::function
答案 1 :(得分:1)
std::function
是std::pointer_to_unary_function
等的替代品:
typedef std::unordered_set<int,
std::function<size_t(int)>,
std::function<bool(int,int)>> NewSet;
std::function
已弃用所有这些仿函数。
(虽然正如评论中提到的那样,常规函数指针在这里会更受欢迎,因为std::function
用于存储任何类型的可调用实体。)
答案 2 :(得分: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 ) );