introspection.adapt.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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.hpp>
  5. #include <iostream>
  6. #include <string>
  7. namespace hana = boost::hana;
  8. using namespace hana::literals;
  9. using namespace std::literals;
  10. //! [BOOST_HANA_DEFINE_STRUCT]
  11. struct Person {
  12. BOOST_HANA_DEFINE_STRUCT(Person,
  13. (std::string, name),
  14. (int, age)
  15. );
  16. };
  17. //! [BOOST_HANA_DEFINE_STRUCT]
  18. int main() {
  19. //! [for_each]
  20. Person john{"John", 30};
  21. hana::for_each(john, [](auto pair) {
  22. std::cout << hana::to<char const*>(hana::first(pair)) << ": "
  23. << hana::second(pair) << std::endl;
  24. });
  25. // name: John
  26. // age: 30
  27. //! [for_each]
  28. //! [for_each.fuse]
  29. hana::for_each(john, hana::fuse([](auto name, auto member) {
  30. std::cout << hana::to<char const*>(name) << ": " << member << std::endl;
  31. }));
  32. //! [for_each.fuse]
  33. #ifdef BOOST_HANA_CONFIG_ENABLE_STRING_UDL
  34. {
  35. //! [at_key]
  36. std::string name = hana::at_key(john, "name"_s);
  37. BOOST_HANA_RUNTIME_CHECK(name == "John");
  38. int age = hana::at_key(john, "age"_s);
  39. BOOST_HANA_RUNTIME_CHECK(age == 30);
  40. //! [at_key]
  41. }{
  42. //! [to<map_tag>]
  43. auto map = hana::insert(hana::to<hana::map_tag>(john), hana::make_pair("last name"_s, "Doe"s));
  44. std::string name = map["name"_s];
  45. BOOST_HANA_RUNTIME_CHECK(name == "John");
  46. std::string last_name = map["last name"_s];
  47. BOOST_HANA_RUNTIME_CHECK(last_name == "Doe");
  48. int age = map["age"_s];
  49. BOOST_HANA_RUNTIME_CHECK(age == 30);
  50. //! [to<map_tag>]
  51. }
  52. #endif
  53. }
  54. //! [BOOST_HANA_ADAPT_STRUCT]
  55. namespace not_my_namespace {
  56. struct Person {
  57. std::string name;
  58. int age;
  59. };
  60. }
  61. BOOST_HANA_ADAPT_STRUCT(not_my_namespace::Person, name, age);
  62. //! [BOOST_HANA_ADAPT_STRUCT]
  63. //! [BOOST_HANA_ADAPT_ADT]
  64. namespace also_not_my_namespace {
  65. struct Person {
  66. std::string get_name();
  67. int get_age();
  68. };
  69. }
  70. BOOST_HANA_ADAPT_ADT(also_not_my_namespace::Person,
  71. (name, [](auto const& p) { return p.get_name(); }),
  72. (age, [](auto const& p) { return p.get_age(); })
  73. );
  74. //! [BOOST_HANA_ADAPT_ADT]