c++ - 实现我自己的 myless

标签 c++ c++11 c++14

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

相关文章:

c++ - 将旧的 Mecab 库实现到现代 iOS 应用程序中

c++ - GNU autotools 的推荐版本是什么?

c++ - 如何回到在C++中切换

c++ - sizeof std::aligned_storage 实际可用存储大小?

c++ - 哪些 VertexList 类型对 depth_first_search 有效

c++ - 使用c++ 14构建时可以使用pack fold表达式(c++ 17扩展名)

c++ - 非指针类成员 : how good is it?

c++ - 不会使迭代器(和指针)失效的容器

c++ - 未调用构造函数

windows - 您需要安装什么才能在 Windows 上使用 Clang 为 64 位构建 c++14?