有没有办法替换默认的
template <typename T, typename charT, typename traits>
std::basic_ostream<charT, traits> &
operator << (std::basic_ostream<charT, traits> &strm, const std::complex<T>& c)
带有我自己版本的标准库附带的?我不能只使用上面的签名重载它,因为编译器抱怨(并且它是正确的)关于模糊调用。我需要这样的重载,因为我希望以不同的格式显示std::complex
个数字,例如a + b*i
,而不是默认的(a,b)
。
我可以简单地这样做
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::complex<T>& c)
{
os << real(z) << " + " << imag(z) << "i";
return os;
}
然而,这不是std
中使用的通用版本,并且不会被其他库调用,例如Eigen。
答案 0 :(得分:1)
你可以做什么 - 至少因为你已经愿意采取官方禁止的方法来向namespace std
添加一些与用户定义的类无关的东西 - 是明确地将它专门用于你需要的类型。
template <typename charT, typename traits>
std::basic_ostream<charT, traits>&
operator << (std::basic_ostream<charT, traits> &strm, const std::complex<double>& c)
{
strm<<c.real()<<"+"<<c.imag()<<"*i";
return strm;
}
编译器将选择完美匹配而不是模板化版本。为您需要的每种类型重载它。
但请注意,遵循C ++标准,这会产生未定义的行为,因为您可能不会向namespace std
添加任何替换现有实现的内容。
尽管如此,它似乎至少在使用g ++编译器的ideone.com上工作,并且可能对其他现代编译器也是如此[此猜测基于this thread here]