Мое приложение содержит многочисленные идентификаторы. Я хочу, в конечном счете, сделать код доступным для просмотра другими, но не упростить для инженеров, работающих в обратном направлении, поиск легко идентифицируемых идентификаторов. Кроме того, во время разработки полезно иметь постоянные идентификаторы в файлах журналов для упрощения отладки. Но во время выполнения я хотел бы сделать эти идентификаторы случайными, создав их во время компиляции Release. Предлагаемый код с использованием <random>
lib приведен ниже в GetRandomId1()
. constexpr
делает их использование в коде возможно как в операторах switch. Тем не менее, у меня возникают проблемы с использованием constexpr
в моей предложенной функции, потому что <random>
не является constexpr
совместимым. Есть ли другой способ генерации случайных чисел во время компиляции? Или генерирует случайные числа во время компиляции, которые будут использоваться как константы во время выполнения, рассмотренные против концепции constexpr
?Замена магических идентификационных номеров случайными идентификаторами, сгенерированными во время компиляции
#include <iostream>
#include <random>
// this is the code I would like to use to generate a random number at compile time
/*constexpr */int GetRandomId1()
{
std::random_device rd; // non-deterministic seed
std::mt19937 gen(rd()); // with constexpr uncommented:
// error C3250: 'rd': declaration is not allowed in 'constexpr' function body
// error C3249: illegal statement or sub-expression for 'constexpr' function
// error C3250: 'gen': declaration is not allowed in 'constexpr' function body
std::uniform_int_distribution<> distri(1000, 9999); // with constexpr uncommented:
// error C3250: 'distri': declaration is not allowed in 'constexpr' function bod
// error C3249: illegal statement or sub-expression for 'constexpr' function
// error C2134: 'std::uniform_int<_Ty>::operator()': call does not result in a constant expression
return distri(gen);
}
// this code is what works so far
constexpr int GetRandomId2()
{
return 22; // how to make somewhat random?
}
constexpr int AAA = 10;
//constexpr int AAA = GetRandonId1(); // error: is not constexpr function
constexpr int BBB = GetRandomId2(); // ok
void Func1(long ab)
{
switch(ab)
{
case AAA:
std::cout << AAA << std::endl;
break;
case BBB:
std::cout << BBB << std::endl;
break;
}
}
int main()
{
Func1(22); // ok: prints 22
return 0;
}
Ищу прямой вперед, ремонтопригодны решение, как один я предложил и в отличие от интенсивного использования шаблонов, как предложено в How can I generate dense unique type IDs at compile time?. Также в этой публикации @jmihalicza указывает на исследовательскую работу Random number generator for C++ template metaprograms. В данной статье описывается генерация случайных чисел во время компиляции с использованием метапрограммирования шаблонов, что представляет собой сложную попытку, которая выполняет задачу, для которой был разработан IMO constexpr
(осмелюсь сказать или должен был быть?).
Из-за архитектурных соображений приложения мне не нужно беспокоиться о столкновениях с ИД, так что это не проблема. Код приложения гарантирует, что дубликатов не будет возвращено.
Вы всегда можете добавить пользовательский шаг предварительной сборки, который генерирует случайные числа в файл, чтобы быть '# include'd – sp2danny