2016-12-29 3 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

Я не говорю, я хотел бы сделать это таким образом, но вы могли установить специальный std::num_get<char> огранку для печати nan когда 0 печатается:

#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

Почему бы не использовать это:

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

В верхней части моей функции вы создаете объект строки temp. – LazyCat

Смежные вопросы