函数在C ++中进行整数比较

时间:2017-03-29 16:55:19

标签: c++ c++11 comparison-operators

我正在编写一个比较多个整数的可变参数模板函数。 我想用这种方式使用它:

template<typename T, typename... Args>
bool multiple_comparison(T first, bool(* compar)(T&, T&), T second, Args... args){
    return compar(first, second) && multiple_comparison(second, args...);
} 

int main(){
  multiple_comparison(1, <, 3); //should return true
  return 0;
}

但是,我有编译问题:

  error: no matches converting function ‘operator<’ to type ‘bool (*)(int&, int&)’

我想这是因为这不是用于原始类型的函数。 我找到了&#34; std :: less&#34; (和其他运营商)在线,但它是C ++ 14,我坚持使用C ++ 11。

有办法吗?因为,目前我唯一能想到的是用自定义函数替换每个比较运算符。

感谢。

2 个答案:

答案 0 :(得分:3)

无论你想要实现什么,这都不是我们用C ++做的方式。 这更加惯用,(适用于任何C ++预C ++ 11)。

#include<functional>  //for std::less
template<typename T, class Comparison>
bool multiple_comparison(T first, Comparison comp, T second){
    return comp(first, second);
} 

int main(){
  multiple_comparison(1, std::less<int>(), 3); //should return true
}

我删除了可变参数部分,因为这不是问题的一部分,并且递归是错误的。

编辑:从评论我推断这是你想要的。

  

即使是数学家也会同意,想要实现的是一个   危险滥用表示法(例如,如果你放弃std::greater   在序列的中间,每个人都会感到困惑)

无论如何这是:

#include<utility> //for std::forward
template<typename T>
constexpr bool multiple_comparison(T const& second){return true;} 

template<typename T, class Compare, class... Rest>
bool multiple_comparison(T const& first, Compare comp, T const& second, Rest&&... rest){
    return comp(first, second) and multiple_comparison(second, std::forward<Rest>(rest)...);
} 

#include<functional>  //for std::less and equal
#include<cassert>
int main(){
  // is    1 < 3 == 3 < 5 ?
  assert( multiple_comparison(1, std::less<int>(), 3, std::equal_to<int>(), 3, std::less<int>(), 5) );
  // is    1 < 3 == 4 < 5 ?
  assert( not multiple_comparison(1, std::less<int>(), 3, std::equal_to<int>(), 4, std::less<int>(), 5) );

// bonus for C++11, explicit type omitted
  assert( multiple_comparison(1, std::less<>(), 3, std::equal_to<>(), 3, std::less<>(), 5) );
  assert( not multiple_comparison(1, std::less<>(), 3, std::equal_to<>(), 4, std::less<>(), 5) );

}

答案 1 :(得分:0)

functional中的比较函数存在于C ++ 14之前;它们在该版本中略有改变。如果你看here,你会发现在C ++ 14之前,它们没有T的默认值,你必须自己指定它,但它们仍然存在。

如果这些函数不存在,你可以编写直接使用运算符的lambdas(如[](const T& lhs, const T& rhs) { return lhs < rhs; })。