【发布时间】:2012-04-09 00:34:58
【问题描述】:
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;
}
};
我可以看到 std::plus 等的通用版本由于返回类型的问题可能会变得更加棘手(尽管decltype 可以解决这个问题)。不过,我看不出 std::equal_to 函数对象本身需要模板参数的任何可能原因。
这些版本肯定存在于 boost 或 STL 中的某个地方吗?当然,它们写起来很简单,但我非常不喜欢复制库代码,尤其是像这样看似微不足道的东西。
编辑:
关于我为什么想要这个而不是使用 lambdas 或其他函数对象生成方法的一些上下文:
因此,我正在编写一个通用的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) -
+1,但我认为您找不到受支持的。问题很重要(我昨天刚刚在an answer 中写了这段代码),但它还不足以吸引 Boost 开发者,而且
std::equal_to的破坏程度还不够高,以至于标准化委员会会弃用它。 -
@AndrewTomazos-Fathomling 哈哈是的!尝试在没有计算机的情况下编写代码来检查我的语法总是让我在某个地方绊倒
标签: c++ templates generics boost stl