我想提供取決於是否與給定類型的operator>>
的兩種不同的實現是一種特殊類型的子類:的std :: is_base_of爲模板向量函數參數
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
有問題嗎?
非常感謝,這解決了問題!我有一個簡短的後續問題:我可以提供第三個明確的專業化嗎?''template <> std :: istream&operator >>(std :: istream&is,std :: vector&vec){...}''不會編譯,因爲錯誤C2794:'type':不是任何直接或間接基類的成員'std :: enable_if ''' –
PhilLab
@PhilLab傾向於超過函數特化 –
duuhhh,我錯過了顯而易見的:-)。如果你只有一把錘子,一切看起來都像釘子 – PhilLab