constexpr random
хочу поинтересоваться у обывателей стака об одном очень интересном вопросе. Возможно ли реализовать такую функцию, которая в одно время будет предкомпилированной ( constexpr ) и в то же время будет возвращать случайное значение при вызове. Например:
constexpr uint32_t h1 = function( );
constexpr uint32_t h2 = function( );
constexpr uint32_t h3 = function( );
И все эти переменные должны иметь разное значение. Как по мне это выглядит противоречиво, а что думаете Вы?
Ответы (1 шт):
Если что то в с++ нельзя решить обычным кодом, тогда нужны шаблоны. Если не справляются шаблоны, тогда нужно доставать самую черную магию - макросы. В с/с++ есть ряд заранее определенных макросов, значение которых "зависит от места". К таким относятся __TIME__ (время на момент компиляции), __COUNTER__ (просто счетчик, который увеличивается при каждом обращении), __LINE__ (номер текущей строки). Учитывая все это, скомбинируем их где то так
#define function() (__TIME__[7] * __COUNTER__ * __LINE__) % 17
или
#define function() (__TIME__[7] + __COUNTER__ * __LINE__) * 100 % 19
Даже будучи вызванным в одной строки, скорее всего даст разные результаты (об этом побеспокоится __COUNTER__). Так же при разных компиляциях будет разное время, а __TIME__[7] возвращает последнюю цифру секунд (как символ) (формат __TIME__ специфицирован - hh:mm:ss).
Можно конечно ещё и __DATE__ использовать, но оно не так часто меняется. В целом, комбинируем, наслаждаемся.