有没有在boost中与std :: equal_to,std :: greater等函数对象家族通用的函数对象?
基本上,std :: equal_to应该变成类似于
我能理解std::plus等泛型版本可能更加棘手,因为存在返回类型问题(虽然decltype可以解决这个问题)。但是我无法想象std::equal_to函数对象本身需要模板参数的任何可能原因。
在boost或STL中肯定有这些版本存在,但我非常不喜欢复制库代码,尤其是对于这种看似微不足道的东西。
编辑:
以下是一些背景信息,说明我为什么想要这个而不是使用lambda或其他函数对象生成方法:
我正在编写一个通用的boost::fusion序列比较函数,如下所示:
请注意
基本上,std :: equal_to应该变成类似于
struct generic_equal_to
{
template <class T, class U>
bool operator()(const T& t, const U& u) const
{
return t == u;
}
};
我能理解std::plus等泛型版本可能更加棘手,因为存在返回类型问题(虽然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>
部分,这导致您无法通过类型实际指定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中没有generic_equal_to
函数对象,因此提出了这个问题。
operator()(const T& t, const U& u)
。 - Andrew Tomazosstd::equal_to
没有出现足够严重的问题,以至于标准化委员会不会弃用它。 - Potatoswatter