sfinae.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #include <boost/hana/assert.hpp>
  5. #include <boost/hana/chain.hpp>
  6. #include <boost/hana/equal.hpp>
  7. #include <boost/hana/optional.hpp>
  8. #include <laws/base.hpp>
  9. #include <support/tracked.hpp>
  10. namespace hana = boost::hana;
  11. using hana::test::ct_eq;
  12. struct undefined { };
  13. int main() {
  14. hana::test::_injection<0> f{};
  15. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  16. hana::sfinae(f)(),
  17. hana::just(f())
  18. ));
  19. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  20. hana::sfinae(f)(ct_eq<0>{}),
  21. hana::just(f(ct_eq<0>{}))
  22. ));
  23. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  24. hana::sfinae(f)(ct_eq<0>{}, ct_eq<1>{}),
  25. hana::just(f(ct_eq<0>{}, ct_eq<1>{}))
  26. ));
  27. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  28. hana::sfinae(undefined{})(),
  29. hana::nothing
  30. ));
  31. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  32. hana::sfinae(undefined{})(ct_eq<0>{}),
  33. hana::nothing
  34. ));
  35. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  36. hana::sfinae(undefined{})(ct_eq<0>{}, ct_eq<1>{}),
  37. hana::nothing
  38. ));
  39. auto incr = hana::sfinae([](auto x) -> decltype(x + 1) {
  40. return x + 1;
  41. });
  42. BOOST_HANA_RUNTIME_CHECK(hana::equal(
  43. incr(1),
  44. hana::just(2)
  45. ));
  46. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  47. incr(undefined{}),
  48. hana::nothing
  49. ));
  50. BOOST_HANA_RUNTIME_CHECK(hana::equal(
  51. hana::chain(hana::just(1), incr),
  52. hana::just(2)
  53. ));
  54. // using `sfinae` with a non-pod argument used to fail
  55. hana::sfinae(undefined{})(Tracked{1});
  56. hana::sfinae([t = Tracked{1}](auto) { return 1; })(Tracked{1});
  57. }