c++ - Вывод в поток данных при выполнении условий (использование тернарной операции)


0

Подскажите можно ли как-то записать в 1 строчку следующий код:

std::cout << "info: ";

if (isEq)
    std::cout << "value: " << value1 << std::endl;
else
    std::cout << "data: " << data1 << std::endl;

На что-то подобное

std::cout << "info " << ((isEq) ? ("value: " << value1) : ("data: " << data1)) << std::endl;
Источник
  •  126
  •  2
  • 18 янв 2019 2019-01-18 07:52:39
Пожалуйста, не указывайте в заголовках вопросов используемый ЯП. Для этого предназначены метки — 18 янв 20192019-01-18 07:44:26.000000
Можно, но это ухудшит читаемость кода — 18 янв 20192019-01-18 07:42:32.000000

2 ответа

4

Можно, но не так - так у вас получается

("value: " << value1)

но оператор << к строке неприменим.

А вот так - да:

std::cout << "info " << (isEq ? "value: " : "data: ")
    << (isEq ? value1 : data1) << std::endl;

Понятно, что типы value1 и data должны быть совместимыми - например, int и double - будет выполнено приведение, как в арифметическом выражении. Если несовместимые - то вернитесь к своей первой (более понятной) записи.

  • 18 янв 2019 2019-01-18 07:54:50
@HolyBlackCat Смотря насколько разные. Если одно приводится к другому - то вполне: ideone.com/cxZy5Z 18 янв 20192019-01-18 07:53:16.000000
0

Можно:

std::cout << "info: " << (isEq ? ("value: " + std::to_string(value1)) : ("data: " + std::to_string(data1))) << std::endl;

Но мне кажется, читаемость получившегося кода намного хуже того, что приведено у вас :) .

  • 18 янв 2019 2019-01-18 07:48:40
Если это арифметические типы, то можно и так: cout << (isEq ?"value: ": "data: ") << value*isEq + data *(!isEq); — 18 янв 20192019-01-18 08:22:24.000000
Это работает только если data1 и value1 имеют арифметические типы... — 18 янв 20192019-01-18 07:50:58.000000