SFINAE и std :: numeric_limits - PullRequest
       26

SFINAE и std :: numeric_limits

0 голосов
/ 02 ноября 2018

Я пытаюсь написать потоковый класс, который обрабатывает числовые и нечисловые данные отдельно. Может кто-нибудь объяснить мне, почему этот код не компилируется?

#include <iostream>
#include <cstdlib>

#include <type_traits>
#include <limits>

class Stream
{
public:
    Stream() {};

    template<typename T, typename std::enable_if_t<std::numeric_limits<T>::is_integer::value>>
    Stream& operator<<(const T& val)
    {
        std::cout << "I am an integer type" << std::endl;
        return *this;
    };

    template<typename T, typename std::enable_if_t<!std::numeric_limits<T>::is_integer::value>>
    Stream& operator<<(const T& val)
    {
        std::cout << "I am not an integer type" << std::endl;
        return *this;
    };
};

int main()
{
    Stream s;
    int x = 4;
    s << x;
}

1 Ответ

0 голосов
/ 02 ноября 2018

Потому что вы делаете SFINAE неправильно, и вы также неправильно используете черту (нет ::value, is_integer - логическое значение). Ошибка с trait тривиальна, проблема с SFINAE заключается в том, что вы указали нетипизированный параметр шаблона для operator<<, но никогда не предоставляете аргумент для него. Вам необходимо указать аргумент по умолчанию.

Пример кода:

#include <cstdlib>
#include <iostream>
#include <type_traits>
#include <limits>

class Stream
{
public:
    Stream() {};

    template<typename T, std::enable_if_t<std::numeric_limits<T>::is_integer>* = nullptr>
    Stream& operator<<(const T& val)
    {
        std::cout << "I am an integer type" << std::endl;
        return *this;
    };

    template<typename T, std::enable_if_t<!std::numeric_limits<T>::is_integer>* = nullptr>
    Stream& operator<<(const T& val)
    {
        std::cout << "I am not an integer type" << std::endl;
        return *this;
    };
};

int main()
{
    Stream s;
    int x = 4;
    s << x;
}
...