/* @copyright Louis Dionne 2015 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include using namespace boost::hana; using namespace std::literals; //! [main] template auto function = left(op + std::string{" is not a valid operation"}); template <> auto function<'+'> = right([](auto x, auto y) { return x + y; }); template <> auto function<'-'> = right([](auto x, auto y) { return x - y; }); // and so on... template auto digit = if_(bool_<(n >= '0' && n <= '9')>, right(static_cast(n - 48)), left(n + std::string{" is not a valid digit"}) ); template auto evaluate = ap(function, digit, digit); int main() { BOOST_HANA_RUNTIME_CHECK(evaluate<'1', '+', '2'> == right(1 + 2)); BOOST_HANA_RUNTIME_CHECK(evaluate<'?', '+', '2'> == left("? is not a valid digit"s)); BOOST_HANA_RUNTIME_CHECK(evaluate<'1', '?', '2'> == left("? is not a valid operation"s)); BOOST_HANA_RUNTIME_CHECK(evaluate<'1', '+', '?'> == left("? is not a valid digit"s)); BOOST_HANA_RUNTIME_CHECK(evaluate<'?', '?', '?'> == left("? is not a valid operation"s)); } //! [main]