是否有免费的模板函数将基本类型转换为字符串

时间:2010-11-16 15:28:48

标签: 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:
       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

据我所知,警告的原因在于调用&lt;&lt;时的隐式转换可能性。

这些含糊不清主要由其他模板生成,如下所示:

  template<typename T>
    T& operator<<(T& out, const SymRad& angle){
    return out << angle.deg();
  }

但是那些具有其他优点,例如为多种流类型工作。 所以我想保留它们。如果我将第二个模板转换为普通方法,例如徘徊,模糊不清,但我正在寻找......这允许保留两个模板。 是否有一个通用函数可以提供相同的简单性而不会使用所描述的选项生成警告? 如果没有,本地禁用已发布警告的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

看起来你会从这样的场景中得到这样的信息:

#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';
}

我建议改用-pedantic标志。由于编译器扩展,GCC完全编译它,与其他编译器一样,这将是一个直接的错误。


关于你的补充:

  template<typename T>
    T& operator<<(T& out, const SymRad& angle){
    return out << angle.deg();
  }
  

但是那些还有其他优点,比如为几种流类型工作。

这实际上不适用于多种流类型。例如,如果Tstringstream,那么out << angle.deg();可能会返回对ostream的引用,该引用无法隐式下载回stringstream引用。

答案 1 :(得分:1)

据我所知,您的编译器为此目的支持#pragma - 我知道VC ++可以。但是,您也可以使用boost :: lexical_cast。