#include #include #include "test.h" template class Trait, class... Ts> struct as_integral_constant { typedef Trait::type...> result_type; typedef std::integral_constant type; }; template class Trait, class... Ts> constexpr typename as_integral_constant::type trait(Ts&&...) { return typename as_integral_constant::type(); } template struct is_integral : fit::detail::and_...> {}; namespace builder { // class FIT_FUNCTION_CLASS((sum_class)(const auto x, const auto y) if(trait(x, y))(x + y) else (1)) // object FIT_FUNCTION_OBJECT((sum)(const auto x, const auto y) if(trait(x, y))(x + y) else (1)) FIT_FUNCTION_OBJECT((sum2)(const auto x, const int y) if(trait(x))(x + y)) // pipe FIT_FUNCTION_PIPE_OBJECT((sum_pipe)(const auto x, const auto y) if(trait(x, y))(x + y) else (1)) // // const_value // FIT_FUNCTION_OBJECT((const_value)(const auto x) if(x == std::integral_constant())(true)) // FIT_FUNCTION_OBJECT((const_value)(const auto x) if(x == std::integral_constant())(true) else (false)) // FIT_FUNCTION_OBJECT((const_value2)(const auto x) if(x == std::integral_constant())(true) else if(x == std::integral_constant())(false)) } struct foo {}; FIT_TEST_CASE() { FIT_TEST_CHECK( builder::sum(1, 2) == 3 ); FIT_TEST_CHECK( builder::sum2(1, 2) == 3 ); FIT_TEST_CHECK( builder::sum_class()(1, 2) == 3 ); FIT_TEST_CHECK( (1 | builder::sum_pipe(2)) == 3 ); FIT_TEST_CHECK( builder::sum(foo(), 2) == 1 ); // FIT_TEST_CHECK( const_value(std::integral_constant()) ); // FIT_TEST_CHECK( !const_value(std::integral_constant()) ); }