我试图了解 std::less 是如何实现的,所以我可以说
template <typename T>
struct myless
{
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
};
template <typename A, typename B, typename U = myless> // std::less works
bool f(A a, B b, U u = U())
{
return u(a, b);
}
int main()
{
std::cout << std::boolalpha;
std::cout << f("AB/CD", "CD/AB") << '\n';
std::cout << f(100, 10) << '\n';
}
这行不通。有什么建议吗?
最佳答案
f("AB/CD", "CD/AB",)
中有错字(逗号)。
应该是typename U = myless<A>
因为myless
不在 std
中命名空间。
此外,参数可能应该通过引用传递:bool f(const A& a, const B& b, const U& u = U())
.
std::less
需要两个操作数的类型相同(逻辑上),并且 myless
也是这样定义的。所以使用 myless<A>
对于 U
会使它转换 B
反对 A
用于比较(通过使用其复制构造函数创建一个临时文件)。
自 C++14 起,还有特化 std::less<void>
其中操作数可以有不同的类型,并且返回类型不是 bool。它一对一映射到 operator<
的内容做。参见 http://en.cppreference.com/w/cpp/utility/functional/less_void .
代码的更正版本:
#include <iostream>
template <typename T>
struct myless
{
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
};
template <typename A, typename B, typename U = myless<A>>
bool f(const A& a, const B& b, const U& u = U())
{
return u(a, b);
}
int main()
{
std::cout << std::boolalpha;
std::cout << f("AB/CD", "CD/AB") << '\n';
std::cout << f(100, 10) << '\n';
}
对于可以有不同类型和非 bool 返回类型的版本:
struct myless2 {
template<class T, class U>
constexpr auto operator()(const T& t, const U& u) const -> decltype(t < u) {
return t < u;
}
};
std::less<void>
似乎也支持 r 值引用,因为当 operator<
是这样定义的(当时可能做的不是比较。)
关于c++ - 实现我自己的 myless,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28998933/