Prima di tutto, ho letto questa domanda: Is there a way to detect portably that a standard header is included using macros?Posso tranquillamente usare #ifdef per sapere se è inclusa un'intestazione std C++?
E quello che voglio sapere è: Quanto è sicuro da usare #ifdef
per il compito di rilevare se un colpo di testa C++ std è incluso, come nel codice qui di seguito:
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
}
... in modo che ho potuto non solo sovraccaricare qualche funzione std come "match di peggio", come proposto nella risposta alla domanda citata, ma anche la compilazione o meno di una intera funzione/sezione del mio header file, a seconda dell'inclusione di alcune intestazioni std.
In questo modo non è affatto sicuro, come sospetto? Se è così, ci sono altri modi per rilevarlo per fare ciò che voglio?
Riguardo a "Perché diavolo non ho solo include l'intestazione" ...
Il codice do come un esempio di quello che sto cercando di fare è solo un esempio. Avevo anche altre cose nella mia mente e volevo solo sapere se c'era un altro modo per verificare l'inclusione delle intestazioni senza controllare i macro che ci si aspetta siano definiti all'interno di essi. Poi mi sono ricordato di questa situazione reale in cui mi sono interrogato su questo e ho iniziato chiedendo cosa sto chiedendo ... visto che, in questo caso, non voglio includere molto codice (<random>
è più lungo di 20 o 30 LOC) solo per "sostenere" una singola funzione della mia intestazione.
Basta includere l'intestazione? – Dani
SFINAE ........? –
BTW, perché non includi semplicemente #include? –