3

最も基本的な型を文字列に変換するテンプレート化された関数を提供したいと考えています。これまでのところ、私が思いついた最高のものは次のとおりです。

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();
  }

ただし、これらには、複数のストリーム タイプで機能するなど、他の利点があります。だから私はそれらを維持したいと思います。2 番目のテンプレートを ostream などの単純なメソッドにすると、あいまいさが解消されますが、sth を探しています。これにより、両方のテンプレートを保持できます。説明されているオプションを使用して警告を生成することなく、同じ単純さを提供する汎用関数はありますか? そうでない場合、発行された警告をローカルで無効にする最善の方法は何ですか?

4

2 に答える 2

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();
  }

ただし、これらには、複数のストリーム タイプで機能するなど、他の利点があります。

これは実際には、いくつかのストリーム タイプでは機能しません。たとえば、Tisstringstreamの場合、参照に暗黙的にダウンキャストできないout << angle.deg();への参照が返される可能性があります。ostreamstringstream

于 2010-11-16T15:46:39.837 に答える
1

私の知る限り、あなたのコンパイラはこの目的のために #pragma をサポートしています - 私は VC++ がサポートしていることを知っています。ただし、boost::lexical_cast を使用することもできます。

于 2010-11-16T15:47:49.443 に答える