Оператор перегрузки << для массивов - PullRequest
7 голосов
/ 24 февраля 2012

Я хочу перегрузить operator<< для произвольных массивов, чтобы код cout << my_arr работал. Сначала я попытался перегрузить второй параметр operator<< на const T (&arr)[N], где T и N - параметры шаблона. Но тестирование кода выявило побочный эффект: const char[] также соответствует спецификации типа, и новая перегрузка конфликтует с той, которая определена в классе потока. Пример кода:

#include <cstddef>
#include <iostream>

template<typename T, std::size_t N>
std::ostream& operator<<(std::ostream& os, const T (&arr)[N])
{
    /* do stuff */
    return os;
}

int main()
{
    std::cout << "noooo\n"; /* Fails: ambiguous overload */
}

Можно ли реализовать такой оператор печати в массиве?

1 Ответ

5 голосов
/ 24 февраля 2012

Конечно:

template<typename T, std::size_t N>
typename std::enable_if<!std::is_same<T, char>::value, std::ostream&>::type
operator<<(std::ostream& os, const T (&arr)[N])
{
    // ...
}

Это отключит вашу перегрузку, когда T равно char с использованием SFINAE .

Для C ++ 03, Boost имеет enable_if и is_same.Или просто бросьте свой собственный:

template<class T, class U> struct is_same { 
    enum { value = false }; 
};
template<class T> struct is_same<T, T> { 
    enum { value = true }; 
};

template<bool, class T> struct enable_if {};
template<class T> struct enable_if<true, T> { 
    typedef T type; 
};
...