mirror of
https://github.com/boostorg/describe.git
synced 2026-01-19 04:12:07 +00:00
Add example/struct_to_tuple.cpp
This commit is contained in:
@@ -161,6 +161,18 @@ using boost::describe::operators::operator==;
|
||||
The rest of the relational operators are also provided and can
|
||||
be enabled similarly.
|
||||
|
||||
[#example_struct_to_tuple]
|
||||
## struct_to_tuple
|
||||
|
||||
This example defines a function `struct_to_tuple` that takes
|
||||
a described class type as an argument and returns a tuple of
|
||||
all its public members.
|
||||
|
||||
[source]
|
||||
----
|
||||
include::../../example/struct_to_tuple.cpp[lines=5..-1]
|
||||
----
|
||||
|
||||
[#example_to_json]
|
||||
## Automatic Conversion to JSON
|
||||
|
||||
|
||||
55
example/struct_to_tuple.cpp
Normal file
55
example/struct_to_tuple.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe.hpp>
|
||||
#include <tuple>
|
||||
|
||||
namespace desc = boost::describe;
|
||||
|
||||
template<class T, template<class...> class L, class... D>
|
||||
auto struct_to_tuple_impl( T const& t, L<D...> )
|
||||
{
|
||||
return std::make_tuple( t.*D::pointer... );
|
||||
}
|
||||
|
||||
template<class T, class Dm = desc::describe_members<T,
|
||||
desc::mod_public | desc::mod_inherited>>
|
||||
auto struct_to_tuple( T const& t )
|
||||
{
|
||||
return struct_to_tuple_impl( t, Dm() );
|
||||
}
|
||||
|
||||
#include <boost/core/type_name.hpp>
|
||||
#include <iostream>
|
||||
|
||||
struct X
|
||||
{
|
||||
int a = 1;
|
||||
};
|
||||
|
||||
BOOST_DESCRIBE_STRUCT(X, (), (a))
|
||||
|
||||
struct Y
|
||||
{
|
||||
float b = 3.14f;
|
||||
};
|
||||
|
||||
BOOST_DESCRIBE_STRUCT(Y, (), (b))
|
||||
|
||||
struct Z: X, Y
|
||||
{
|
||||
};
|
||||
|
||||
BOOST_DESCRIBE_STRUCT(Z, (X, Y), ())
|
||||
|
||||
int main()
|
||||
{
|
||||
Z z;
|
||||
|
||||
auto tp = struct_to_tuple( z );
|
||||
|
||||
std::cout <<
|
||||
boost::core::type_name<decltype(tp)>() << ": "
|
||||
<< std::get<0>(tp) << ", " << std::get<1>(tp);
|
||||
}
|
||||
@@ -85,3 +85,4 @@ run ../example/json_rpc.cpp : : : $(CXX14) $(JSON) ;
|
||||
run ../example/hash_value.cpp : : : $(CXX14) ;
|
||||
run ../example/equality.cpp : : : $(CXX14) ;
|
||||
link ../example/console.cpp : $(CXX14) $(JSON) ;
|
||||
run ../example/struct_to_tuple.cpp : : : $(CXX14) ;
|
||||
|
||||
Reference in New Issue
Block a user