Другие примеры действительно хороши. Есть и другой вариант, хотя я бы его не рекомендовал (упомяну только для полноты).
GCC имеет расширение под названием «Условные выражения с опущенными операндами», которое в основном выглядит следующим образом:
x = a ?: b;
, что аналогично (в таких простых случаях, как ваш, для получения дополнительной информации см. Ниже):
x = a ? a : b;
Просто менее портативный. Таким образом, вы могли бы написать:
std::wstringstream outstream;
outstream << (prop.m_pwszOriginalVolumeName ?: L"null") << L";"
<< (prop.m_pwszSnapshotDeviceObject ?: L"null") << L";"
<< (prop.m_pwszOriginatingMachine ?: L"null") << L";"
Но, как я уже сказал, я не рекомендовал бы рекомендовать это, я бы использовал вспомогательную функцию, как и в других ответах.
На самом деле есть случай, когда он работает не так, как обычный троичный if, и это если оценка a
имеет побочные эффекты. Со страницы:
В этом простом случае возможность опустить средний операнд не
особенно полезно. Когда это становится полезным, это когда первый операнд
содержит или может (если это макро-аргумент) содержать побочный эффект. затем
повторение операнда в середине будет выполнять побочный эффект
дважды. Пропуск среднего операнда использует уже вычисленное значение
без нежелательных последствий повторного вычисления.
См. http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html