2015-11-17 2 views
0

Я хочу сделать что-то вроде этого:C++, если-другое заявление в соиЬ

ostream& table(ostream& os, myClass& obj, bool foo1, bool foo2) { 
    os << (foo1 ? obj.getFoo1() : "") << (foo2 ? obj.getFoo2() : ""); 
    return os; 
} 

Теперь моя главная проблема в том, что я не нужен else заявление. Даже если я не могу использовать тернарный оператор без else, мне нужно отправить пространство, например " ". Я бы очень хотел использовать " ", но мой obj.getFoo не возвращает ни одного строкового значения (он возвращает целое число). А для целых чисел нет «пространства».

Есть ли способ получить заявление if-else внутри cout (очевидно, без else)?

ответ

2

Вы можете это сделать, если вы используете to_string:

ostream& table(ostream& os, myClass& obj, bool foo1, bool foo2) { 
    os << (foo1 ? std::to_string(obj.getFoo1()) : "") 
    << (foo2 ? std::to_string(obj.getFoo2()) : ""); 

    return os; 
} 

LIVE DEMO

0

Использование foo1 ? std::to_string(obj.getFoo1()) : std::string(" ").

1

лично я бы просто сделать:

ostream& table(ostream& os, myClass& obj, bool foo1, bool foo2) { 
    if (foo1) 
     os << obj.getFoo1(); 
    if (foo2) 
     os << obj.getFoo2(); 
    return os; 
} 

Сгенерированный код будет почти идентичен в любом случае, и избежать печать пустой строки, для которой потребуется некоторый код.

Тройной оператор очень удобно, если у вас есть действительно длинный набор аргументов функции и только хочет изменить немного:

func(arg1, arg2, arg3, (flag)?arg4a:arg4b, arg5, arg6, arg7); 

[Э.Г. Printf оператор]

Но в случае выхода потока, он не служит на самом деле никакой пользы, так как код для:

a << b << c; 

является такой же, как:

a << b; a << c; 

[а , так близко, как в любом случае]

+0

У меня будет 49 различных foo. Вот почему я ищу короткий путь. – user3653164

+1

Тогда я подозреваю, что вы делаете что-то немного неправильно (или ОЧЕНЬ неправильно). Но короткая версия - добавить еще одну функцию: 'print_if_true (ostream & os, bool cond, Type вещь) {if (cond) os << вещь; }} 'и затем вызывается' print_if_true (os, foo1, obj.getFoo1()); 'и т. д. Если' obj.getFoo1() 'возвращает типы differnet, вам может потребоваться сделать шаблонную функцию. –

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