Zunächst einmal habe ich diese Frage lesen: Is there a way to detect portably that a standard header is included using macros?Kann ich sicher #ifdef verwenden, um zu wissen, ob ein C++ std-Header enthalten ist?
Und was will ich weiß, ist: Wie sicher ist es #ifdef
für die Aufgabe der Erkennung zu verwenden, wenn ein C++ std-Header enthalten ist, wie in dem Code unten:
namespace overwrite
{
using byte = unsigned char;
template <bool safeMode = true, typename generic>
void withZeros(generic *toBeOverwriten, size_t length = 1)
{
// do stuff
}
#ifdef _GLIBCXX_RANDOM // found this macro inside <random>
template <bool safeMode = true, typename generic>
void withRandomData(generic *toBeOverwriten, byte min = 0, byte max = 255)
{
// do stuff expecting <random> to be included
}
#endif
}
... so dass ich nicht nur könnte eine std Funktion als „schlechtes Match“ überlaste, wie in der Antwort auf die genannte Frage vorgeschlagen, sondern auch kompilieren oder nicht eine ganze Funktion/section of My Kopf Datei, abhängig von der Aufnahme einiger Std-Header.
Ist dieser Weg überhaupt nicht sicher, wie ich vermute? Wenn ja, gibt es andere Möglichkeiten, dies zu erkennen, um das zu tun, was ich will?
In Bezug auf „Warum zum Teufel ich den Header einfach nicht schließen“ ...
Der Code, den ich als ein Beispiel für das, was ich versuche, ist nur ein Beispiel zu tun. Ich hatte noch andere Dinge in meinem Kopf und wollte nur wissen, ob es eine andere Möglichkeit gibt, nach Header zu suchen, ohne Makros zu checken, von denen man erwartet, dass sie in diesen definiert werden. Dann erinnerte ich mich an diese reale Situation, in der ich mich selbst danach fragte, und ich begann mit der Frage, was ich verlange ... da ich in diesem Fall nicht viel Code einfügen möchte (<random>
ist länger als 20) oder 30 LOC) nur um eine einzelne Funktion meines Headers zu "erhal- ten".
schließen Sie einfach den Header? – Dani
SFINAE ........? –
BTW, warum nicht einfach #include random? –