From 0f6d47133e5497fc42a9ef8a18291b1835a17eef Mon Sep 17 00:00:00 2001 From: barcode Date: Mon, 26 Dec 2022 17:46:00 +0100 Subject: [PATCH] Add nlohmann::json::as_base_class --- docs/examples/as_base_class.cpp | 40 +++++++++++++++++++ docs/examples/as_base_class.output | 3 ++ .../docs/api/basic_json/as_base_class.md | 32 +++++++++++++++ docs/mkdocs/docs/api/basic_json/index.md | 1 + docs/mkdocs/mkdocs.yml | 1 + include/nlohmann/json.hpp | 10 +++++ single_include/nlohmann/json.hpp | 10 +++++ 7 files changed, 97 insertions(+) create mode 100644 docs/examples/as_base_class.cpp create mode 100644 docs/examples/as_base_class.output create mode 100644 docs/mkdocs/docs/api/basic_json/as_base_class.md diff --git a/docs/examples/as_base_class.cpp b/docs/examples/as_base_class.cpp new file mode 100644 index 000000000..6eb2c53a0 --- /dev/null +++ b/docs/examples/as_base_class.cpp @@ -0,0 +1,40 @@ +#include +#include + +class base_class_with_shadowed_members +{ + public: + + int m_value = 43; + + const char* type_name() const noexcept + { + return "my_name"; + } +}; + +using json = nlohmann::basic_json < + std::map, + std::vector, + std::string, + bool, + std::int64_t, + std::uint64_t, + double, + std::allocator, + nlohmann::adl_serializer, + std::vector, + base_class_with_shadowed_members + >; + +int main() +{ + json j; + + //access the shadowing method + std::cout << j.type_name() << "\n"; + + //access the shadowed method and member variable + std::cout << j.as_base_class().type_name() << "\n"; + std::cout << j.as_base_class().m_value << "\n"; +} diff --git a/docs/examples/as_base_class.output b/docs/examples/as_base_class.output new file mode 100644 index 000000000..f9954efa3 --- /dev/null +++ b/docs/examples/as_base_class.output @@ -0,0 +1,3 @@ +null +my_name +43 diff --git a/docs/mkdocs/docs/api/basic_json/as_base_class.md b/docs/mkdocs/docs/api/basic_json/as_base_class.md new file mode 100644 index 000000000..84f8d32da --- /dev/null +++ b/docs/mkdocs/docs/api/basic_json/as_base_class.md @@ -0,0 +1,32 @@ +# nlohmann::basic_json::as_base_class + +```cpp +json_base_class_t& as_base_class(); +const json_base_class_t& as_base_class() const; +``` + +Returns this object casted to [json_base_class_t](json_base_class_t.md). + +## Return value + +This object casted to [json_base_class_t](json_base_class_t.md). + +## Examples + +??? example + + Use `as_base_class` to access shadowed methods and member variables defined in [json_base_class_t](json_base_class_t.md). + + ```cpp + --8<-- "examples/as_base_class.cpp" + ``` + + Output: + + ```json + --8<-- "examples/as_base_class.output" + ``` + +## Version history + +Added in version ???.???.??? diff --git a/docs/mkdocs/docs/api/basic_json/index.md b/docs/mkdocs/docs/api/basic_json/index.md index fb2be8fef..3aad26b24 100644 --- a/docs/mkdocs/docs/api/basic_json/index.md +++ b/docs/mkdocs/docs/api/basic_json/index.md @@ -151,6 +151,7 @@ The class satisfies the following concept requirements: - [**array**](array_t.md) (_static_) - explicitly create an array - [**binary**](binary.md) (_static_) - explicitly create a binary array - [**object**](object_t.md) (_static_) - explicitly create an object +- [**as_base_class**](as_base_class.md) - cast this object to [json_base_class_t](json_base_class_t.md) ### Object inspection diff --git a/docs/mkdocs/mkdocs.yml b/docs/mkdocs/mkdocs.yml index 8319354a4..20425f2fa 100644 --- a/docs/mkdocs/mkdocs.yml +++ b/docs/mkdocs/mkdocs.yml @@ -100,6 +100,7 @@ nav: - 'accept': api/basic_json/accept.md - 'array': api/basic_json/array.md - 'array_t': api/basic_json/array_t.md + - 'as_base_class' : api/basic_json/as_base_class.md - 'at': api/basic_json/at.md - 'back': api/basic_json/back.md - 'begin': api/basic_json/begin.md diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index a3c0af1e0..18a916c93 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -5155,6 +5155,16 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec } /// @} + + json_base_class_t& as_base_class() + { + return static_cast(*this); + } + + const json_base_class_t& as_base_class() const + { + return static_cast(*this); + } }; /// @brief user-defined to_string function for JSON values diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 073070a41..92f5d4ebb 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -24379,6 +24379,16 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec } /// @} + + json_base_class_t& as_base_class() + { + return static_cast(*this); + } + + const json_base_class_t& as_base_class() const + { + return static_cast(*this); + } }; /// @brief user-defined to_string function for JSON values