您好我正在尝试为int,double,null终止字符数组等编写一个通用的isLess比较函数。下面是我的代码,请帮助我理解我们如何使用此函数来处理空终止字符串。
#include<iostream>
using namespace std;
template<typename T>
bool isLess(T &x, T &y)
{
return x < y;
}
int main()
{
int a(10), b(20);
double c(2.0), d(3.0);
cout<<isLess<int>(a,b)<<endl;
cout<<isLess<double>(c,d)<<endl;
//For above types, generic comparator works fine
//but if we have to compare character represented string, how can we do this in our comparator
//assume charaters strings are compared the same way as strcmp.
//char *e = "str1";
//char *f = "str2";
//cout<<isLess<char*>(e,f)<<endl;
return 0;
}
答案 0 :(得分:1)
您可以使用标准库中的比较器(即std::less
)。
那就是说,如果你想为自己定义它们,为什么不使用通用lambda呢?
auto isLess = [](auto &x, auto &y) {
return x<y;
};
auto isLessStr = [](auto *x, auto *y) {
// ... Use whatever you want here
};
然后将其用作isLess(a,b)
和isLessChar(e, f)
。
答案 1 :(得分:1)
std::less
几乎就是标准。
如果您愿意,除了char*
之外,您可以滚动自己的功能。一个解决方案是添加一个选择器,该选择器使用您自己的比较器,如果您不为特定类型提供一个,则回退到标准:
struct my_string_compare {
bool operator()(const char* a, const char* b) const {
// do whatever you want here.
}
};
template<typename T>
struct select_less {
using type = std::less<T>;
};
template<>
struct select_less<char*> {
using type = my_string_compare;
};
template<typename T>
using my_less = typename select_less<T>::type;
然后,你可以使用你的功能:
my_less<char*> char_less;
if (char_less("string1", "string2")) {
// ...
}
my_less<int> int_less;
// Same as std::less<int>
if (int_less(7, 9)) {
// ...
}
如果您需要更多重载,那么您只需添加另一项专业化,这真是太棒了。
另一个优点是您不会覆盖任何标准行为。您可以使用自己的结构,也可以使用标准结构。
有关using
执行操作的说明,请参阅typedef和Using-declaration