uso tiene sirven significado reservadas que para palabras operadores operador logicos cuantas c# c++ null null-coalescing-operator

c# - tiene - palabras reservadas en c++ y su significado pdf



C#nulo operador coalescente equivalente para c++ (5)

¿Qué tal esto?

#define IFNULL(a,b) ((a) == null ? (b) : (a))

¿Existe un equivalente de C ++ para el operador de unión nula de C #? Estoy haciendo demasiadas comprobaciones nulas en mi código. Así que estaba buscando una manera de reducir la cantidad de código nulo.



No hay una manera de hacer esto por defecto en C ++, pero podría escribir una:

en C # el ?? operador se define como

a ?? b === (a != null ? a : b)

Entonces, el método C ++ se vería como

Coalesce(a, b) // put your own types in, or make a template { return a != null ? a : b; }


Solo quiero expandir la respuesta de @Samuel Garcia generalizando la plantilla y agregando macros de ayuda para reducir la repetición de lambda:

#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 (

Usando las macros, puedes simplemente:

int* f(); int* g(); int* h(); int* x = COALESCE( f() OR_ELSE g() OR_ELSE h() );

Espero que esto ayude.


Utilizando plantillas y lambdas C ++ 11. El primer argumento (lado izquierdo) solo se evalúa una vez. El segundo argumento (lado derecho) solo se evalúa si el primero es falso (tenga en cuenta que ''if'' y ''?'' Convierten de forma estática la expresión proporcionada en bool, y que los punteros tienen el ''operador explícito bool () const'' que es igual a ''! = nullptr'')

template<typename TValue, typename TSpareEvaluator> TValue coalesce(TValue mainValue, TSpareEvaluator evaluateSpare) { return mainValue ? mainValue : evaluateSpare(); }

Ejemplo de uso

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";

Solo imprimirá ''0xf'' en la consola. Tener que escribir un lambda para el rhs es un poco de repetitivo

[&] () { return <rhs>; }

pero es lo mejor que uno puede hacer si le falta el soporte de la sintaxis del lenguaje.