Detectar soporte de operador con decltype / SFINAE

A (algo) anticuadoartícul explora formas de usardecltype junto con SFINAE para detectar si un tipo admite ciertos operadores, como== o<.

Aquí hay un código de ejemplo para detectar si una clase admite la< operador:

template <class T>
struct supports_less_than
{
    static auto less_than_test(const T* t) -> decltype(*t < *t, char(0))
    { }

    static std::array<char, 2> less_than_test(...) { }

    static const bool value = (sizeof(less_than_test((T*)0)) == 1);
};

int main()
{
    std::cout << std::boolalpha << supports_less_than<std::string>::value << endl;
}

Esto generatrue, ya que por supuestostd::string apoya el< operador. Sin embargo, si trato de usarlo con una clase que no apoyen el< operador, me sale un error del compilador:

error: no match for ‘operator<’ in ‘* t < * t’

So SFINAE no está trabajando aquí. Probé esto en GCC 4.4 y GCC 4.6, y ambos exhibieron el mismo comportamiento. Entonces, ¿es posible usar SFINAE de esta manera para detectar si un tipo admite ciertas expresiones?

Respuestas a la pregunta(5)

Su respuesta a la pregunta