Прежде всего, я прочитал этот вопрос: Is there a way to detect portably that a standard header is included using macros?Могу ли я безопасно использовать #ifdef, чтобы узнать, включен ли заголовок std C++?
И то, что я хочу знать: Насколько безопасно использовать #ifdef
для задачи обнаружения, если C++ станд заголовок включен, как в коде ниже:
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
}
... так что я не мог просто перегружать некоторую зУю функцию, как «хуже матч», как предложено в ответ на указанный вопрос, но и компилировать или не целую функцию/раздел Моего заголовка файл, в зависимости от включения какого-либо std-заголовка.
Этот способ небезопасен, как я подозреваю? Если да, есть ли другие способы обнаружить это, чтобы делать то, что я хочу?
Касательно «Почему, черт возьми, я просто не включают заголовок» ...
Код Даю в качестве примера того, что я пытаюсь сделать, это просто пример. У меня были и другие вещи в моем уме, и я просто хотел знать, есть ли другой способ проверить включение заголовков без проверки макросов, которые вы ожидаете определить внутри них. Затем я вспомнил об этой реальной ситуации, когда я спросил себя об этом, и я начал с того, что спросил, о чем я прошу ... поскольку в данном случае я не хочу включать много кода (<random>
длиннее 20 или 30 LOC), чтобы «выдержать» одну функцию моего заголовка.
Просто включить заголовок? – Dani
SFINAE ........? –
Кстати, почему бы вам просто не включить # случай? –