我正在尝试在C++11中实现has_equal_operator
,目前想出了以下解决方案。它适用于简单的情况,如int
或struct A{}
,但对于std::vector<A>
等情况会失败(返回错误的结果)。为什么会失败以及如何修复?
#include <vector>
#include <iostream>
template<typename T>
constexpr auto has_equal_operator(int) -> decltype(std::declval<T>() == std::declval<T>(), bool()) { return true; }
template<typename T>
constexpr bool has_equal_operator(...) { return false; }
struct A {};
void test()
{
std::cout << "has_equal_operator<int>: " << has_equal_operator<int>(0) << std::endl;
std::cout << "has_equal_operator<A>: " << has_equal_operator< A >(0) << std::endl;
std::cout << "has_equal_operator<std::vector<A>>: " << has_equal_operator< std::vector<A> >(0) << std::endl;
}
输出:
has_equal_operator<int>: 1
has_equal_operator<A>: 0
has_equal_operator<std::vector<A>>: 1
==
对于两个向量不起作用吗? - user253751operator ==
,则不应该定义std::vector
的operator ==
。 - o11cbool operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
不依赖于declval<_Tp>() == declval<_Tp>()
的有效性有关。 - o11c