我希望提供一个模板函数,将大多数基本类型转换为字符串。
到目前为止,我想到的最好方法如下:
任何toString和类似函数的问题在于使用gcc版本4.4.3 -Wall -Wextra -Werror编译时会生成歧义警告。"ISO C ++表示,即使第一个最差的转换优于第二个最差的转换,这些都是模棱两可的。"据我所知,警告的原因在于调用<<时的隐式转换可能性。这些歧义主要由其他模板生成,如下所示:
template<typename T> inline std::string anyToString(const T& var) {
std::ostringstream o;
o << var;
return o.str();
}
该函数可以用于以下方面:
class TimeError:public std::runtime_error{
public:
explicit TimeError(int time):std::runtime_error(anyToString(time)),
mTime(time){};
protected:
int mTime;
};
任何toString和类似函数的问题在于使用gcc版本4.4.3 -Wall -Wextra -Werror编译时会生成歧义警告。"ISO C ++表示,即使第一个最差的转换优于第二个最差的转换,这些都是模棱两可的。"据我所知,警告的原因在于调用<<时的隐式转换可能性。这些歧义主要由其他模板生成,如下所示:
template<typename T>
T& operator<<(T& out, const SymRad& angle){
return out << angle.deg();
}
但是它们有其他优点,比如可以适用于多种流类型。因此,我希望保留它们。如果我将第二个模板转换为普通方法(例如ostream),则可以消除歧义,但我正在寻找一种方法,可以同时保留两个模板。 是否有一种通用函数,可以提供相同的简洁性,并使用所描述的选项而不生成警告? 如果没有,最好的方法是在本地禁用发出的警告。
boost::lexical_cast<std::string>()
对你没用吗?(它不能解决歧义警告,但自己编写“转换”函数似乎是多余的) - Matthieu M.