Как я могу определить, может ли тип передаваться в 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
Что я делаю не так