Очевидно, вам нужно гибкое решение, которое может поддерживать типы, маскирующиеся под логические значения. Для этого необходимо следующее:
template<typename T> bool Flip(const T& t);
Затем вы можете специализировать это для различных типов, которые могут претендовать на логическое значение. Например:
template<> bool Flip<bool>(const bool& b) { return !b; }
template<> bool Flip<int>(const int& i) { return !(i == 0); }
Пример использования этой конструкции:
if(Flip(false)) { printf("flipped false\n"); }
if(!Flip(true)) { printf("flipped true\n"); }
if(Flip(0)) { printf("flipped 0\n"); }
if(!Flip(1)) { printf("flipped 1\n"); }
Нет, я не серьезно.