C++ 是否有将基本类型转换为字符串的无警告模板函数
我想提供一个模板函数,将最基本的类型转换为字符串。 到目前为止,我提出的最佳方案如下:C++ 是否有将基本类型转换为字符串的无警告模板函数,c++,templates,ambiguous,C++,Templates,Ambiguous,我想提供一个模板函数,将最基本的类型转换为字符串。 到目前为止,我提出的最佳方案如下: 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: e
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++表示,这些都是模棱两可的,即使第一个最坏的转换比第二个< /代码>的最坏的转换”更好。
据我所知,发出警告的原因在于调用时隐含的转换可能性。您似乎会从这样的场景中得到这样的消息:
#include <sstream>
#include <string>
#include <iostream>
struct Y {};
struct X
{
operator Y() const {return Y(); }
};
std::ostream& operator<< (std::ostream& os, X) { return os << "X"; }
std::ostream& operator<< (std::ostringstream& os, Y) { return os << "Y"; }
template<typename T> inline std::string anyToString(const T& var) {
std::ostringstream o;
o << var;
return o.str();
}
int main()
{
std::cout << anyToString(X()) << '\n';
}
但它们还有其他优点,比如适用于多种流类型
这实际上不适用于几种流类型。例如,如果
T
是stringstream
,那么out就我所知,您的编译器为此目的支持一个#pragma-我知道VC++支持。但是,您也可以使用boost::lexical_cast。Hmm。您可以添加一个如何使用此模板的示例吗?@Oli Charlesworth:为usage@Martin,当你说“那些选项”时,你说的是什么选项?boost::lexical_cast()
不适合你?(这并不能解决歧义警告,但滚动您自己的“转换”函数似乎是多余的)@Matthieu:boost::lexical_cast-works。到目前为止,我还不知道,boost::lexical_cast
会因我的回答中演示的一组类似的重载而失败(除了它使用stringstream
)。boost::lexical cast会起作用,尽管我必须为这个人和其他将使用该模板的人安装并包括boost。很好的例子,我在描述中添加了真正的邪恶来源,但你的例子也说明了同样的问题-pedantic在我的代码中看起来不错,但我使用了几个qt4库,这些库在警告/错误中是一个噩梦generation@UncleBens:关于operator@UncleBens当前位置我认为模板@Martin:你自己试试看。现有<代码>operator@UncleBens(有点吹毛求疵):std::basic_ostream
的重载比std::ostream
:template std::basic_ostream&operator更好
#include <sstream>
#include <string>
#include <iostream>
struct Y {};
struct X
{
operator Y() const {return Y(); }
};
std::ostream& operator<< (std::ostream& os, X) { return os << "X"; }
std::ostream& operator<< (std::ostringstream& os, Y) { return os << "Y"; }
template<typename T> inline std::string anyToString(const T& var) {
std::ostringstream o;
o << var;
return o.str();
}
int main()
{
std::cout << anyToString(X()) << '\n';
}
template<typename T>
T& operator<<(T& out, const SymRad& angle){
return out << angle.deg();
}