Meine App enthält zahlreiche IDs. Ich möchte schließlich den Code für andere sichtbar machen, aber es den Reverse-Engineern der Laufzeitumgebung nicht leicht machen, nach leicht bekannten IDs zu suchen. Außerdem ist es während der Entwicklung hilfreich, in den Protokolldateien konstante IDs zu haben, um das Debuggen zu erleichtern. Aber zur Laufzeit möchte ich diese IDs zufällig machen, indem ich sie während der Release-Kompilierung erzeuge. Vorgeschlagener Code, der die <random>
Lib verwendet, kann in GetRandomId1()
unten gesehen werden. constexpr
ermöglicht ihre Verwendung im Code wie in Switch-Anweisungen. Allerdings habe ich Probleme mit constexpr
in meiner vorgeschlagenen Funktion, weil <random>
nicht constexpr
kompatibel ist. Gibt es eine andere Möglichkeit, Zufallszahlen zur Kompilierzeit zu generieren? Oder generiert Zufallszahlen zur Kompilierzeit, um sie zur Laufzeit als Konstanten zu verwenden, die gegen das Konzept constexpr
behandelt werden?Ersetzen von magischen ID-Nummern durch zufällige IDs, die zur Kompilierungszeit generiert wurden
#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;
}
ich für eine gerade nach vorne suchen, wartbare Lösung, wie ich sie vorgeschlagen und im Gegensatz zu den starken Gebrauch von Vorlagen wie in How can I generate dense unique type IDs at compile time? vorgeschlagen. Auch in diesem Beitrag verweist @jmihalicza auf die Random number generator for C++ template metaprograms Forschungsarbeit. Dieses Papier beschreibt die Generierung von Zufallszahlen für die Kompilierungszeit unter Verwendung der Template-Metaprogrammierung, die ein komplizierter Versuch ist, der eine Aufgabe erfüllt, für die IMO constexpr
entworfen wurde (zu wagen oder zu sagen?).
Aus Gründen der App-Architektur muss ich mir keine Gedanken über ID-Kollisionen machen, deshalb ist das kein Problem. Der App-Code würde sicherstellen, dass keine Duplikate zurückgegeben werden.
Sie könnten immer einen benutzerdefinierten Pre-Build-Schritt hinzufügen, der Zufallszahlen in Datei erzeugt, um '# include'd zu sein – sp2danny