boost中有没有函数对象是std :: equal_to,std :: greater等系列函数对象的泛型等价物?相当于std函数对象的泛型
从本质上讲,性病:: equal_to应该成为像
struct generic_equal_to
{
template <class T, class U>
bool operator()(const T& t, const U& u) const
{
return t == u;
}
};
我可以看到性病的仿制版本::加等可能是棘手由于与返回类型的问题(虽然decltype
能解决这个问题)。尽管如此,我无法看到std :: equal_to函数对象本身应该需要模板参数的任何可能原因。
无论在boost还是在STL中,这些版本都存在?当然,它们是微不足道的,但是我非常不喜欢重复库代码,特别是对于像这样明显微不足道的东西。
编辑:
由于一些背景,为什么我想这个,而不是使用lambda表达式,或者另一个函数对象生成方法:
我正是如此写一个通用boost::fusion
序列比较功能:
template <class T>
bool sequence_equal(const T& left, const T& right)
{
return fusion::all(
fusion::zip(left, right),
fusion::fused<generic_equal_to>());
}
注意fusion::fused<generic_equal_to>
部分,这导致了ISSE,你不能根据实际情况指定一个boost::lambda
或boost::phoenix
按功能对象类型。我想一个解决方案可能是decltype:
fusion::fused<decltype(_1 == _2)>()
这似乎很尴尬,虽然,甚至可能没有工作,这取决于如何boost::lambda
或boost::phoenix
实现 - 我真的不知道。
我知道你可以使用fusion::make_fused
来解决这个问题,但是你必须实例化函数对象。那么我想到的解决方案将是一个非模板equal_to
结构 - 我叫我的generic_equal_to
。
我知道这是一个非常微不足道的问题 - 毕竟,make_fused(_1 == _2)
可能内联到与fused<generic_equal_to>
几乎相同的程序集。我简直不敢相信在boost或STL中没有任何函数对象,所以这个问题。
我想你的意思'运营商()(const的T&T,常量U&U)' – 2012-04-09 00:59:56
+1,但我不认为你会找到一个支持的功能。这个问题很重要(我昨天刚刚写了这个代码[答案](http://stackoverflow.com/questions/10063037/unordered-set-storing-elements-as-pointers/10063081#10063081)),但它是没有足够的性感来吸引Boost开发者,而且std :: equal_to没有足够的突破,标准化委员会将会贬低它。 – Potatoswatter 2012-04-09 01:36:02
@ AndrewTomazos-Fathomling哈哈!试图写代码没有计算机来检查我的语法*总是*让我上某处 – Ayjay 2012-04-09 01:41:00