Общая информация
Безопасно использовать #ifdef
на тот случай, если мы хотим, чтобы компилятор оптимизировал некоторую часть кода, как показано ниже.
#ifdef LOG
mtmd();
#endif
Следовательно, если LOG
не определено во время компиляции, во время выполнения не будет никаких накладных расходов.
Вопрос
Мне интересно реализовать тот же механизм с использованием SFINAE. Упрощенная версия кода показана ниже.
template <bool cond, typename std::enable_if<cond>::type* = nullptr>
inline void log(void (*func)(int, int), int in, int out) {
(*func)(in, out);
}
template <bool cond, typename std::enable_if<!cond>::type* = nullptr>
inline void log(void (*func)(int, int), int in, int out) {}
Я могу использовать его в следующей форме.
void mtmd(int x, int y) { /* Do something */}
int main() {
constexpr cond = true; // or flase
int x, y;
log<cond>(&mtmd, x, y);
}
Вопрос в том, когда cond
равно false
будут ли какие-либо издержки, или компилятор все оптимизирует, так как функция log
равна inline
?