【发布时间】:2010-11-16 15:28:48
【问题描述】:
我想提供一个将大多数基本类型转换为字符串的模板化函数。 到目前为止,我想出的最好的方法如下:
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;
};
anyToString 和类似函数的问题是使用 gcc 版本 4.4.3 -Wall -Wexta -Werror 编译时产生歧义警告
"ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second"
据我所知,警告的原因在于调用
这些歧义主要是由其他模板产生的,如下所示:
template<typename T>
T& operator<<(T& out, const SymRad& angle){
return out << angle.deg();
}
但它们还有其他优点,例如适用于多种流类型。 所以我想保留它们。如果我将第二个模板变成一个简单的方法,例如ostream 歧义已被清除,但我正在寻找某事。这允许保留两个模板。 是否有一个通用函数可以提供相同的简单性而不会使用所描述的选项生成警告? 如果没有,本地禁用发出的警告的最佳方法是什么?
【问题讨论】:
-
嗯。你能添加一个你如何使用这个模板的例子吗?
-
@Oli Charlesworth:添加了一个用法示例
-
@Martin,当你说“那些选项”时,你指的是什么选项?
-
boost::lexical_cast<std::string>()不适合你? (它不会解决歧义警告,但滚动你自己的“转换”功能似乎是多余的) -
@Matthieu: boost::lexical_cast 有效。我到现在都不知道