我希望提供两种不同的
将第二个运算符定义更改为:
operator>>
实现,取决于给定类型是否是特殊类型的子类:class A {};
class B : public A{};
class C {};
template<typename T>
std::istream& operator>>(std::istream& is,
std::vector<typename std::enable_if<std::is_base_of<A, T>::value>::type>& vec)
{
std::cout << "Special case called" << std::endl;
return is;
}
template<typename T>
std::istream& operator>>(std::istream& is,
std::vector<T>& vec)
{
std::cout << "General case called" << std::endl;
return is;
}
void main(int argc, char **argv)
{
std::vector<A> a;
std::vector<B> b;
std::vector<C> c;
std::stringstream ss("A string");
ss >> a;
ss >> b;
ss >> c;
}
打印哪些内容
General case called
General case called
General case called
将第二个运算符定义更改为:
template<typename T>
std::istream& operator>>(std::istream& is,
std::vector<typename std::enable_if<!std::is_base_of<A, T>::value>::type>& vec)
{
std::cout << "General case called" << std::endl;
return is;
}
因为以下原因,无法编译:
error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::stringstream'
我可能在错误地使用std::enable_if
。但是正确的用法是什么?这里的模板化std::vector
是否有问题?