[cfe-dev] Determining whether Container<T>()==Container<T>() can compile?
Stephen Kelly
steveire at gmail.com
Wed May 29 05:42:51 PDT 2013
Stephen Kelly wrote:
> I can't actually figure out how to use libcxx on linux, so the above is
> not tested.
I hacked around a bit with libcxxabi and tested the patch. The testcode now
indeed gives the expected results for std::vector:
#include <iostream>
#include <vector>
template<typename T, typename U = bool>
struct HasEqualityComparison
{
enum { value = false };
};
template<typename T>
struct HasEqualityComparison<T, decltype(std::declval<T&>() ==
std::declval<T&>())>
{
enum { value = true };
};
struct A {
};
struct B {
bool operator==(const B &other)
{
return true;
}
};
int main()
{
std::cout << HasEqualityComparison<A>::value << std::endl;
std::cout << HasEqualityComparison<std::vector<A>>::value << std::endl;
std::cout << HasEqualityComparison<B>::value << std::endl;
std::cout << HasEqualityComparison<std::vector<B>>::value << std::endl;
std::cout << HasEqualityComparison<std::vector<std::vector<A>>>::value <<
std::endl;
std::cout << HasEqualityComparison<std::vector<std::vector<B>>>::value <<
std::endl;
return 0;
}
$ ./a.out
0
0
1
1
0
1
All that remains is figuring out how to get the stl implementations updated
to use that for all containers, if possible.
Thanks,
Steve.
More information about the cfe-dev
mailing list