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++ - Rust 找不到 Microsoft C++ 构建工具

C++ (14) 和手动内存管理

c++ - 静态模板化 constexpr 嵌套类成员

c++ - 将私有(private)静态数组作为参数传递给 C++ 中的公共(public)成员函数?

c++ - 遍历一棵 n 叉树

c++ - 如果 const 引用也只需要一个拷贝,为什么在 C++11 中建议按值传递(如果需要拷贝)?

c++ - 可变参数模板 : choose the tuple element type that has a proper method

c++ - constexpr函数: gcc/msvc vs clang/icc [duplicate]的const引用参数

c++ - QImage 没有通过信号槽 Qt

C++ 类层次结构设计选择