Ben*_*ley 4 c++ templates enable-if c++11
template<typename T>
std::istream & read(std::istream & istr, typename std::enable_if<std::is_pod<T>::value, T>::type & value)
{
return istr.read( reinterpret_cast<char*>(&value), sizeof(T));
}
int main()
{
int x;
read(cin, x); // error here
}
error C2783: 'std::istream &read(std::istream &,std::enable_if<std::tr1::is_pod<_Ty>::value,T>::type &)' : could not deduce template argument for 'T'
Run Code Online (Sandbox Code Playgroud)
如果我指定read <int>,它可以工作.有没有办法让它从论证中推断出类型?
Joh*_*itb 15
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));
}
Run Code Online (Sandbox Code Playgroud)
要么
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));
}
Run Code Online (Sandbox Code Playgroud)
你的原因不起作用的原因是,如果你知道参数的类型,那么确定T是不够的.如果enable_if是这样的模板怎么办?
template<int N, typename T> struct A { typedef int type; };
Run Code Online (Sandbox Code Playgroud)
任何T人<std::is_pod<T>::value, T>都会这样做.通常,由其形成的函数参数类型...T...::type称为非推导上下文,不能用于推导T.