c++ - ejemplo - operador ternario python
Operador ternario equivalente para constexpr si? (2)
Tal vez me perdí algo, pero no puedo encontrar ninguna pista: ¿hay un operador constante en C ++ 17 equivalente a constexpr-if?
template<typename Mode>
class BusAddress {
public:
explicit constexpr BusAddress(Address device) :
mAddress(Mode::write ? (device.mDevice << 1) : (device.mDevice << 1) | 0x01) {}
private:
uint8_t mAddress = 0;
};
No, no hay constexepr
operador condicional. Pero podría envolver todo en una lambda y evaluarlo inmediatamente (un IIFE ):
template<typename Mode>
class BusAddress {
public:
explicit constexpr BusAddress(Address device)
: mAddress([&]{
if constexpr (Mode::write) {
return device.mDevice << 1;
}
else {
return (device.mDevice << 1) | 0x01;
}
}())
{ }
private:
uint8_t mAddress = 0;
};
Puede que no sea el código más sexy de todos, pero hace el trabajo. Tenga en cuenta que las lambdas están constexpr
de forma predeterminada siempre que sea posible a partir de N4487 y P0170 .
Parece que estás actuando bajo la creencia de que if constexpr
es una optimización de rendimiento. No lo es Si coloca una expresión constante en una cláusula ?:
Cualquier compilador que valga la pena usar determinará en qué se resuelve y eliminará la condición. Por lo tanto, el código tal como lo ha escrito casi seguramente se compilará en una sola opción, para un Mode
particular.
El propósito principal de if constexpr
es eliminar la otra rama por completo. Es decir, el compilador ni siquiera comprueba si es sintácticamente válido . Esto sería para algo en el que if constexpr(is_default_constructible_v<T>)
, y si es verdadero, haces T()
. Con una instrucción if
regular, si T
no es constructible por defecto, T()
aún tendrá que ser un código sintácticamente válido incluso si la cláusula if
rodea es una expresión constante. if constexpr
elimina ese requisito; el compilador descartará las declaraciones que no estén en la otra condición.
Esto se vuelve aún más complicado para ?:
, Porque el tipo de expresión se basa en los tipos de los dos valores. Como tal, ambas expresiones deben ser expresiones legales, incluso si una de ellas nunca se evalúa. Una forma constexpr
de ?:
Presumiblemente descartaría la alternativa que no se toma en el momento de la compilación. Y, por lo tanto, el tipo de expresión solo debería basarse en uno de ellos.
Eso es algo muy diferente.