#pragma once #ifndef __FILE_Detail_CP_CBool_Hpp #define __FILE_Detail_CP_CBool_Hpp #define Operator(name,operator,closer)\ template bool name(const First& first, const Second& second) { return closer(first) operator closer(second); }\ template bool name(const First& first, const Args&... args) { return closer(first) operator name(args...);} #define TrueCloser(x) (!!x) Operator(And, &&, TrueCloser); Operator(Or, || , TrueCloser); #undef Operator #undef TrueCloser namespace Internal { template class CAnd_t; template class COr_t; template<> class CAnd_t : public std::true_type {}; template<> class CAnd_t : public std::false_type {}; template class CAnd_t : public CAnd_t {}; template class CAnd_t : public std::false_type {}; template<> class COr_t : public std::true_type {}; template<> class COr_t : public std::false_type {}; template class COr_t : public std::true_type {}; template class COr_t : public COr_t {}; } template constexpr bool CAnd = Internal::CAnd_t::value; template constexpr bool COr = Internal::COr_t::value; template constexpr bool CXor = CAnd != COr; template constexpr bool CNot = false == Value; #endif // !__FILE_Detail_CP_CBool_Hpp