template<typename T>
std::istream & read(std::istream & istr, T value,
typename std::enable_if<std::is_pod<T>::value>::type* = 0)
{
return istr.read( reinterpret_cast<char*>(&value), sizeof(T));
}
Или
template<typename T>
typename std::enable_if<std::is_pod<T>::value, std::istream>::type &
read(std::istream & istr, T value)
{
return istr.read( reinterpret_cast<char*>(&value), sizeof(T));
}
Причина, по которой вы не работаете, состоит в том, что недостаточно определить T, если вы знаете тип аргумента. Что если enable_if
будет шаблоном, подобным следующему?
template<int N, typename T> struct A { typedef int type; };
Любой T
в <std::is_pod<T>::value, T>
сделает это. Как правило, тип параметра функции, сформированный из ...T...::type
, называется не выводимым контекстом и не может использоваться для вывода T
.