Я был взволнован, когда constexpr был введен в С++ 11, но, к сожалению, я сделал оптимистические предположения о его полезности. Я предположил, что мы могли бы использовать constexpr где угодно, чтобы поймать литеральные константы времени компиляции или любой constexpr результат постоянной константы компиляции, включая что-то вроде этого:
constexpr float MyMin(constexpr float a, constexpr float b) { return a<b?a:b; }
Поскольку определение типа возвращаемой функции только как constexpr не ограничивает ее использование для времени компиляции и также должно быть вызвано во время выполнения, я решил, что это будет способ гарантировать, что MyMin можно использовать только с компиляцией, и это обеспечило бы, что компилятор никогда не разрешит его выполнение во время выполнения, освободив меня, чтобы написать альтернативную версию MyMin, совместимую со средой, в идеале с тем же именем, которое использует встроенное _mm_min_ss, гарантируя, что компилятор не будет генерировать код ветвления во время выполнения. К сожалению, параметры функции не могут быть constexpr, поэтому казалось бы, что это невозможно сделать, если только что-то подобное не возможно:
constexpr float MyMin(float a, float b)
{
#if __IS_COMPILE_TIME__
return a<b?a:b;
#else
return _mm_cvtss_f32(_mm_min_ss(_mm_set_ss(a),_mm_set_ss(b)));
#endif
}
У меня есть серьезные сомнения в том, что MSVС++ имеет что-то подобное, но я надеялся, что, возможно, GCC или clang, по крайней мере, что-то достигнут, однако он не может выглядеть так.
Конечно, представленный мной пример был очень упрощенным, но если вы можете использовать свое воображение, есть много случаев, когда вы можете свободно делать что-то вроде широко используемого выражения ветвления внутри функции, которая, как вы знаете, может выполняться только при время компиляции, потому что, если оно выполняется во время выполнения, производительность будет скомпрометирована.