2

Googleで以下のコードを見つけました。'%。* f'がCタイプの形式の文字列で行うような精度を示す方法を提供しないことを除いて、それは私がやりたいことをほぼ実行します。また、小数点以下5桁を超えるものはありません。C文字列とsnprintfに固執する必要がありますか?

#include <string>
#include <sstream>
#include <iostream>

template <class T>
std::string to_string(T t, std::ios_base & (*f)(std::ios_base&))
{
  std::ostringstream oss;
  oss << f << t;
  return oss.str();
}

int main()
{
  std::cout<<to_string<double>(3.1415926535897931, std::dec)<<std::endl;
  return 0;
} 
4

4 に答える 4

2

C ++は、Cができることを実行できなければ、成功しません。

マニピュレータをチェックアウトする必要があります。

Cスタイルのフォーマットが必要な場合(私が好むのはもっと簡潔です)、Boost.Formatをチェックしてください。

于 2009-10-15T23:42:35.800 に答える
2

std::setprecisionマニピュレータを使用する場合:

int main()
{
    std::cout << std::setprecision(9) << to_string<long>(3.1415926535897931, std::dec)
              << '\n';
    return 0;
}
于 2009-10-15T23:43:33.083 に答える
1

Boost :: formatを見たことがありますか?

編集:あなたが何を望んでいるかは完全には明確ではありません。書式設定を使用して文字列に書き込むだけの場合は、文字列ストリームで通常のマニピュレータを使用できます。printfスタイルのフォーマット文字列を使用したいが、型の安全性を維持したい場合は、Boost::formatがそれを実行できます。

于 2009-10-15T23:42:43.227 に答える
1

ほぼ正しい答えをとります (この単純なケースでは std::dec は冗長であることに注意してください):

int main()
{
  std::cout << std::setprecision(9) << std::dec << 3.1415926535897931 << std::endl;
  return 0;
}

ただし、 to_string 関数を希望どおりに動作させたい場合は、少し難しくなります。setprecision(9)関数に渡す必要がありto_string<T>、その型の引数を受け入れません。テンプレート化されたバージョンが必要です:

template <class T, class F>
std::string to_string(T t, F f)
{
  std::ostringstream oss;
  oss << f << t;
  return oss.str();
}
int main()
{
  std::cout << to_string<double>(3.1415926535897931, std::setprecision(9)) << std::endl;
  return 0;
}

これは、to_string で std::dec を本当に必要としなかったために機能します。しかし、より多くのマニピュレータを渡す必要がある場合、簡単な解決策はtemplate <class T, class F1, class F2> std::string to_string(T t, F1 f1, F2 f2)etcetera を追加することです。技術的には、これはあまりうまくスケーリングしませんが、非常にまれであるため、おそらくまったく必要ありません。

于 2009-10-16T08:02:49.130 に答える