2016-12-29 10 views
0

であれば、それは0でない限り、私はタイプ以来出力文字列「ナン」の値が0

int x; 
... 
cout << (!x ? "nan" : x); 

を行うことはできません 出力が「ナン」であることを有するもので、出力に番号が必要です三項式では一致しません。私はできるです

void f(ostream& o, int x) 
{ 
    if (!x) o << x; 
    else o << "nan"; 
} 

私には少し醜いです。これにはより良い解決策がありますか? のようなもの

cout << nanify(x); 

多分?

答えて

3

を:

#include <algorithm> 
#include <iostream> 
#include <locale> 

class zero_num_put 
    : public std::num_put<char> { 
    iter_type do_put(iter_type out, std::ios_base& str, char_type fill, long v) const { 
     if (v == 0) { 
      static char nan[] = "nan"; 
      return std::copy(nan, nan + 3, out); 
     } 
     return std::num_put<char>::do_put(out, str, fill, v); 
    } 
}; 

int main() 
{ 
    std::locale loc(std::locale(), new zero_num_put); 
    std::cout.imbue(loc); 
    std::cout << 0 << " " << 17 << "\n"; 
} 
+0

ありがとう、実際にはかなり有益です。私はそれと一緒に行くと確信していませんが、それは私の問題の "正しい"一般的な解決策のように見えます。 – LazyCat

1

なぜこれは使用しない:私はそのように行うだろうが、あなた0が印刷されたときにnanを印刷するには、カスタムstd::num_get<char>のファセットをインストールすることができ言わないよ

int x; 
... 
cout << (!x ? "nan" : std::to_string(x)); 
+0

おかげさまで、これはオプションですが、それほど効率的ではありませんが、そうですか?ストリームにパイプする前に文字列に変換することを意味します。 – LazyCat

+0

Big Oの計算では、to_stringがどのように実装されているかに応じて、現在よりも高価/低速であってはなりません。ソフトウェアエンジニアリングの観点からは、新しい機能を作成するよりもはるかにクリーンです。マイクロ秒の速度はあなたがやっていることの要件ですか? – user7351608

+0

私はちょうどそれを行う "正しい方法"を探しています。あなたが数字を得るたびに文字列オブジェクトを作成しているので、Big Oの意味は分かりませんが、醜い関数よりかなり遅いと思います。 – LazyCat

0

これらの行に沿って何かを使うことができます:

std::string nanify(const int x) { 
    if (x) { /* If not 0, return 'x' as a string */ 
     return std::to_string(x); 
    } 
    /* Else, return "nan" string */ 
    return "nan"; 
} 

std::cout << nanify(0) << ' ' << nanify(15); /* nan 15 */ 
+0

ありがとうございますが、私のソリューションよりもさらに悪いと思います。 – LazyCat

+0

あなたにはどんなに悪いですか? – Usiten

+0

私の機能の上には、一時的な文字列オブジェクトを作成します。 – LazyCat

関連する問題