Есть ли эквивалент C++ для оператора C# null коалесцирования? Я делаю слишком много нулевых проверок в моем коде. Так что искал способ уменьшить количество нулевого кода.C# null коалесцирующий оператор эквивалент для C++
ответ
Существует не способ сделать это по умолчанию в C++, но вы могли бы написать один:
в C# на ?? оператор определяется как
a ?? b === (a != null ? a : b)
Таким образом, метод C++ будет выглядеть
Coalesce(a, b) // put your own types in, or make a template
{
return a != null ? a : b;
}
В этом методе b вычисляется, даже если a не является нулевым. Это может быть проблемой, если b имеет побочные эффекты. – Amnon
@Amnon: Действительно. Рассмотрим: 'p = Coalesce (p, new int (10));'. Кроме того, похоже, что в C# правый операнд не может быть NULL (не может быть проверен во время компиляции, так как в C++ нет нулевых типов?). С другой стороны: есть ли такая потребность в C++, так что вы не можете просто набрать 'a? a: b; '? – UncleBens
И если это C++ 11 или выше, используйте 'nullptr'. В любом случае в C/C++ нет «null», в некоторых заголовках определяется только «NULL». http://stackoverflow.com/questions/1282295/what-exactly-is-nullptr –
Как об этом?
#define IFNULL(a,b) ((a) == null ? (b) : (a))
Остерегайтесь IFNULL (a ++, b) Да, я понимаю, вы бы хотели остерегаться этого, если вы думаете, что может быть пустым. IFNULL (SomeClass.DoSomethingReallyLong(), "") также вызывает проблемы. – McKay
Хорошая точка - служит мне для того, чтобы быть ленивым. Использование метода шаблона - это, безусловно, способ пойти сюда, поскольку он избегает побочных эффектов и будет иметь эквивалентную производительность (или лучше). Я собираюсь добавить +1 на решение @ McKay. :-) –
Шаблон функции не обязательно должен иметь равную или лучшую производительность. Это «короткое замыкание» ('b' не оценивается, если' a' равно null), тогда как аргументы функции всегда оцениваются. –
Я только что нашел это: The ?? operator aka the Null Coalescing Operator
У вас также есть его в C и C++ в качестве расширения GNU, используя «:» оператор:
строка PAGETITLE = GetTitle() ?: «Заголовок по умолчанию»;
Использование шаблонов и C++ 11 lambdas. Первый аргумент (левая часть) оценивается только один раз. Второй аргумент (правая сторона) оценивается только в том случае, если первый является ложным (обратите внимание, что «if» и «?» Статически передают предоставленное выражение в bool и что указатели имеют «явный оператор bool() const», который является равным к '! = nullptr')
template<typename TValue, typename TSpareEvaluator>
TValue
coalesce(TValue mainValue, TSpareEvaluator evaluateSpare) {
return mainValue ? mainValue : evaluateSpare();
}
Пример использования
void * const nonZeroPtr = reinterpret_cast<void *>(0xF);
void * const otherNonZeroPtr = reinterpret_cast<void *>(0xA);
std::cout << coalesce(nonZeroPtr, [&]() { std::cout << "Never called"; return otherNonZeroPtr; }) << "\n";
Будет просто напечатать '0xf' в консоли. Имея написать лямбда для ОРЗ является немного шаблонный
[&]() { return <rhs>; }
, но это лучшее, что можно сделать, если один не имеет поддержки со стороны синтаксиса языка.
Это единственный ответ, который предлагает идентичную семантику оператора нулевой коалесценции. Это, вероятно, редко стоит суета. Действительно, эта функция просто должна быть на языке. –
Просто хочу, чтобы расширить ответ @Samuel Гарсиа Обобщая шаблон и добавить вспомогательные макросы, чтобы сократить лямбда шаблонного:
#include <utility>
namespace coalesce_impl
{
template<typename LHS, typename RHS>
auto coalesce(LHS lhs, RHS rhs) ->
typename std::remove_reference<decltype(lhs())>::type&&
{
auto&& initialValue = lhs();
if (initialValue)
return std::move(initialValue);
else
return std::move(rhs());
}
template<typename LHS, typename RHS, typename ...RHSs>
auto coalesce(LHS lhs, RHS rhs, RHSs ...rhss) ->
typename std::remove_reference<decltype(lhs())>::type&&
{
auto&& initialValue = lhs();
if (initialValue)
return std::move(initialValue);
else
return std::move(coalesce(rhs, rhss...));
}
}
#define COALESCE(x) (::coalesce_impl::coalesce([&](){ return (x); }))
#define OR_ELSE ); }, [&](){ return (
Используя макросы, вы можете просто:
int* f();
int* g();
int* h();
int* x = COALESCE(f() OR_ELSE g() OR_ELSE h());
I надеюсь это поможет.
- 1. Null-коалесцирующий оператор и оператор && в C#
- 2. Null коалесцирующий оператор с bool
- 3. ?? null-коалесцирующий оператор vs if == null
- 4. C# нуль коалесцирующий оператор возвращения нулевой
- 5. VB эквивалент C# ?? Оператор
- 6. Null-коалесцирующий в Swift 3
- 7. нулевой коалесцирующий оператор присваивание себе
- 8. C# Null-условный оператор
- 9. оператор нуль-коалесцирующий или условный оператор
- 10. Есть ли эквивалент VB.net для C#! оператор?
- 11. C# эквивалент java подготовленный оператор
- 12. Рубиновый эквивалент C#'s ?? Оператор
- 13. JavaScript-эквивалент? оператор в C#
- 14. Почему Nil коалесцирующий оператор Right Associative?
- 15. Как написать NullOrEmpty коалесцирующий оператор
- 16. Оператор присваивания C++ Назначение NULL
- 17. с # нуль-коалесцирующий оператор (??) оптимизация кода компилятор
- 18. C# эквивалент для кода C
- 19. индексированный оператор switch или эквивалент? .net, C#
- 20. Что такое эквивалент VB.NET C#? оператор?
- 21. Objective-C эквивалент оператора 'as' в C#
- 22. C/C++ эквивалент для C# System.Net.Mail
- 23. Как реализовать нулевой коалесцирующий оператор в SQLAlchemy?
- 24. Что такое эквивалент C++ для инициализаторов C?
- 25. C# эквивалент для даного
- 26. jQuery эквивалент для C#
- 27. эквивалент DoEvents для C++?
- 28. httplib эквивалент для C
- 29. Эквивалент C++ для fgets()?
- 30. C++ эквивалент для fscanf
В GCC это 'a?: B', но это не переносится. – MSalters