C++ 11中的has_equal_operator实现

Yat*_*ima 9 c++ type-traits c++11

我试图has_equal_operator在C++ 11中实现,到目前为止提出了以下解决方案.它适用于简单的情况,如intstruct 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

has_equal_operator<int>: 1
has_equal_operator<A>:   0
has_equal_operator<std::vector<A>>: 1
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 3

为什么会失败呢?

std::vector<A>有一个非成员函数模板,它与代码中的inoperator==匹配。这样检查就成功了。==std::declval<T>() == std::declval<T>()

该函数模板的主体无法编译这一事实与 SFINAE 无关;重要的是该声明有效。

如何解决这个问题?

我能想到的唯一方法是手动将您的特征专门化为标准容器。