c++ windows com interop boolean

¿Cómo convertir mejor VARIANT_BOOL a C++ bool?



windows com (6)

Cuando se utilicen valores booleanos COM, deben pasarse como VARIANT_BOOL que se declara en wtypes.h como breve . También hay valores predefinidos para verdadero y falso :

#define VARIANT_TRUE ((VARIANT_BOOL)-1) #define VARIANT_FALSE ((VARIANT_BOOL)0)

¿Cuál es la mejor manera de convertir de VARIANT_BOOL a C ++ bool type? Las variantes obvias son:

  1. comparar con VARIANT_FALSE

  2. simplemente lance a bool

Otras formas pueden ser fácilmente inventadas.

¿Cuál es la mejor manera de hacer esto: la más legible, la más compatible con los estándares, la menos propensa a errores planteados de forma accidental y menos propensa a problemas con la migración a plataformas de 64 bits?


¿Por qué tener un reparto explícito?

if (my_bool) { blargh(); } else { blarglerr(); }

De esta manera, verdadero es verdadero y falso es falso, según el estándar C. Si necesita establecer un bool estilo C ++, haga algo como:

VARIANT_BOOL vb_bool = VARIANT_FALSE bool cpp_bool = !!vb_bool


Casting a bool es obviamente incorrecto. Algunas personas dicen (por ejemplo, comentarios en BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool ) para comparar con VARIANT_FALSE, pero yo compararía con ambos. De esa manera, usted captura los valores no válidos (cualquier cosa excepto VARIANT_FALSE o VARIANT_TRUE) antes.

p.ej

bool VariantBoolToBool(VARIANT_BOOL varFlag) { bool boolFlag; switch( varFlag ) { case VARIANT_TRUE: boolFlag = true; break; case VARIANT_FALSE: boolFlag = false; break; default: throw Exception("Not a valid value"); } return boolFlag; }


Compara con VARIANT_FALSE . Hay una gran cantidad de código de buggy que pasa erróneamente en el valor true C ++ bool (convertido al valor entero 1) a una función que espera VARIANT_BOOL . Si se compara con VARIANT_FALSE , aún obtendrá el valor esperado correcto.


Las reglas de conversión estándar de C ++ se basan en cero, lo que significa falso [y como señala 1800 INFORMACIÓN, la variante VERDADERA es donde ocurre la mayor confusión] y nada más. Por lo tanto, un static_cast sería mejor.

Pero en muchos casos, el código sería más legible como una comparación. En ese caso, VARIANT_BOOL es lo que hay que comparar.


No me gusta tener que preocuparme por la compatibilidad entre diferentes valores booleanos, por lo que normalmente escribiré:

VARIANT_BOOL vb_bool = VARIANT_FALSE; // ... vb_bool set to something by some other code bool myBool = (vb_bool == VARIANT_TRUE);

¿Hay maneras más pequeñas de hacerlo (como en "compilará a un código x86 más simple")? Por supuesto. No vale la pena. Esto está garantizado para que funcione, por lo que puedo preocuparme por mi lógica empresarial.


Declara esta macro en uno de tus encabezados globales.

#define b(X) ((X)!=VARIANT_FALSE)


EDITAR: Versión mucho más segura:

inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}