diff --git a/include/continuable/detail/traits.hpp b/include/continuable/detail/traits.hpp index 3fffc61..a9f39c0 100644 --- a/include/continuable/detail/traits.hpp +++ b/include/continuable/detail/traits.hpp @@ -119,37 +119,40 @@ using void_t = typename detail::deduce_to_void::type; }(0) #else namespace detail { -template -constexpr void static_if_impl(std::true_type, TrueCallback&& trueCallback) { - std::forward(trueCallback)(0); +template +constexpr void static_if_impl(std::true_type, TrueCallback&& trueCallback, + Guard&& guard) { + std::forward(trueCallback)(guard); } -template -constexpr void static_if_impl(std::false_type, - TrueCallback&& /*trueCallback*/) { +template +constexpr void static_if_impl(std::false_type, TrueCallback&& /*trueCallback*/, + Guard&& /*guard*/) { } -template +template constexpr auto static_if_impl(std::true_type, TrueCallback&& trueCallback, - FalseCallback&& /*falseCallback*/) { - return std::forward(trueCallback)(0); + FalseCallback&& /*falseCallback*/, + Guard&& guard) { + return std::forward(trueCallback)(guard); } -template +template constexpr auto static_if_impl(std::false_type, TrueCallback&& /*trueCallback*/, - FalseCallback&& falseCallback) { - return std::forward(falseCallback)(0); + FalseCallback&& falseCallback, Guard&& guard) { + return std::forward(falseCallback)(guard); } } // namespace detail #define CONTINUABLE_IF_CONSTEXPR_SELECT_2(EXPR, TRUE_BRANCH) \ cti::detail::traits::detail::static_if_impl( \ - std::integral_constant{}, [&](auto) mutable { TRUE_BRANCH }) + std::integral_constant{}, [&](auto) mutable { TRUE_BRANCH }, \ + EXPR) #define CONTINUABLE_IF_CONSTEXPR_SELECT_3(EXPR, TRUE_BRANCH, FALSE_BRANCH) \ cti::detail::traits::detail::static_if_impl( \ std::integral_constant{}, [&](auto) mutable { TRUE_BRANCH }, \ - [&](auto) { FALSE_BRANCH }) + [&](auto) { FALSE_BRANCH }, EXPR) #endif // CONTINUABLE_HAS_CXX17_IF_CONSTEXPR // https://stackoverflow.com/questions/16374776/macro-overloading