Я только исправил код ОП, как он и просил. Вероятно, это просто фрагмент файла большего размера, который объясняет отсутствующие включения, и он, вероятно, использует пространство имен std.

олько) устаревшийстатья исследует способы использования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’

Так что СФИНА не работает здесь. Я попробовал это на GCC 4.4 и GCC 4.6, и оба показали одинаковое поведение. Итак, возможно ли использовать SFINAE таким образом, чтобы определить, поддерживает ли тип определенные выражения?

Ответы на вопрос(5)

Ваш ответ на вопрос