我正在编写一个比较多个整数的可变参数模板函数。 我想用这种方式使用它:
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。
有办法吗?因为,目前我唯一能想到的是用自定义函数替换每个比较运算符。
感谢。
答案 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; }
)。