实现我自己的无我
implement my own myless
我试图理解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>
for U
将使它将B
对象转换为用于比较的A
对象(通过使用其复制构造函数创建临时对象)。
自 C++14 以来,还有专门的std::less<void>
,其中操作数可以具有不同的类型,以及不是布尔值的返回类型。它将一对一映射到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';
}
对于可以具有不同类型和非布尔返回类型的版本:
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<
像这样定义时(然后可能会做比较以外的其他事情)。
您的myless
模板采用单一类型,但您的f
函数采用两种类型(即,它们可能是不同的类型)。可以支持这一点,但它涉及更多。您是否打算执行以下操作?
template<typename T, typename U = myless<T>>
bool f(T a, T b, U u = U())
{
return u(a, b);
}
编辑
正如@vscoftco指出的那样,支持不同类型的可能是一个预期的用例。如果要明确支持不同的类型,那么我会像这样实现它。
template<typename A, typename B, typename U = myless<typename std::common_type<A, B>::type>>
bool f(A a, B b, U u = U())
{
return u(a, b);
}
http://en.cppreference.com/w/cpp/types/common_type,该解决方案似乎也与SFINAE兼容(C++17)。
如果大小...(T) 为零,或者如果没有通用类型,则不定义成员类型(std::common_type 对 SFINAE 友好)
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将矩阵乘以我自己的输入的向量
- 如何正确包含我自己的标头?
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 为什么__builtin_popcount比我自己的比特计数功能慢?
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 如何在我自己的staticLib中使用staticLib
- 在我自己的堆栈中实现top的问题
- 尝试检查输入的文本与我自己的自定义答案
- 我应该在服务模板中的什么位置添加自己的代码?
- 如何在我自己的类中重载"+"和"<<"运算符
- 我正在尝试在视觉工作室上创建自己的库/源函数
- C++:我自己类的动态数组
- 如何在 C++ 中使用我自己的类中的库?
- 如何链接我自己的 .so 文件而不是操作系统捆绑包 .so 文件?
- 如何构建默认使用我自己的构建libc ++的clang?
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 分发我自己的程序的几个问题
- 如何自己为我自己的shared_ptr实现实现别名构造函数