Как я могу определить, может ли тип передаваться в std :: ostream?

Я пытаюсь написать характеристику типа, чтобы определить, имеет ли тип перегруженный оператор << (), подходящий для использования в выходном потоке.

Я что-то упускаю, потому что всегда получаю истину для простого пустого класса без операторов вообще.

Вот код:

template<typename S, typename T>
class is_streamable
{
    template<typename SS, typename TT>
    static auto test(SS&& s, TT&& t)
    -> decltype(std::forward<SS>(s) << std::forward<TT>(t));

    struct dummy_t {};
    static dummy_t test(...);

    using return_type = decltype(test(std::declval<S>(), std::declval<T>()));

public:
    static const bool value = !std::is_same<return_type, dummy_t>::value;
};

class C {};

int main() {
    std::cout << is_streamable<std::stringstream, C>::value << std::endl;
    return 0;
}

Выход

1

Вот оно в идеоне:https: //ideone.com/ikSBo

Что я делаю не так

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

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