gpt4 book ai didi

c++ - 实现我自己的 myless

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:44 25 4
gpt4 key购买 nike

我试图了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com