A (несколько) устаревшая статья описывает способы использования decltype
вместе с SFINAE для определения того, поддерживает ли тип определенные операторы, такие как ==
или <
.
Здесь примерный код для определения того, поддерживает ли класс оператор <
:
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;
}
Это выводит true
, так как, конечно, std::string
поддерживает оператор <
. Однако, если я попытаюсь использовать его с классом, который не поддерживает оператор <
, я получаю ошибку компилятора:
error: no match for ‘operator<’ in ‘* t < * t’
Итак, SFINAE здесь не работает. Я попробовал это на GCC 4.4 и GCC 4.6, и оба показали то же поведение. Итак, можно ли использовать SFINAE таким образом, чтобы определить, поддерживает ли тип определенные выражения?