diff --git a/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp b/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp index 22cd66b3..ca3f9dd6 100644 --- a/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp +++ b/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp @@ -21,78 +21,29 @@ MSGPACK_API_VERSION_NAMESPACE(v1) { /// @endcond namespace type { - // tuple - using std::get; - using std::tuple_size; - using std::tuple_element; - using std::uses_allocator; - using std::ignore; - using std::swap; - template< class... Types > - class tuple : public std::tuple { - public: - using base = std::tuple; +template +inline tuple make_tuple(Args&&... args) { + return tuple(std::forward(args)...); +} - using base::base; +template +inline tuple forward_as_tuple (Args&&... args) noexcept { + return tuple(std::forward(args)...); +} - tuple() = default; - tuple(tuple const&) = default; - tuple(tuple&&) = default; +template +inline auto tuple_cat(Tuples&&... args) -> + decltype( + std::tuple_cat(std::forward::type::base>(args)...) + ) { + return std::tuple_cat(std::forward::type::base>(args)...); +} - template - tuple(tuple const& other):base(static_cast const&>(other)) {} - template - tuple(tuple && other):base(static_cast &&>(other)) {} - - tuple& operator=(tuple const&) = default; - tuple& operator=(tuple&&) = default; - - template - tuple& operator=(tuple const& other) { - *static_cast(this) = static_cast const&>(other); - return *this; - } - template - tuple& operator=(tuple && other) { - *static_cast(this) = static_cast &&>(other); - return *this; - } - - template< std::size_t I> - typename tuple_element::type& - get() & { return std::get(*this); } - - template< std::size_t I> - typename tuple_element::type const& - get() const& { return std::get(*this); } - - template< std::size_t I> - typename tuple_element::type&& - get() && { return std::get(*this); } - }; - - template - inline tuple make_tuple(Args&&... args) { - return tuple(args...); - } - - template - inline tuple forward_as_tuple (Args&&... args) noexcept { - return tuple(std::forward(args)...); - } - - template - inline auto tuple_cat(Tuples&&... args) -> - decltype( - std::tuple_cat(std::forward::type::base>(args)...) - ) { - return std::tuple_cat(std::forward::type::base>(args)...); - } - template - inline tuple tie(Args&... args) { - return tuple(args...); - } +template +inline tuple tie(Args&... args) { + return tuple(args...); +} } // namespace type // --- Pack from tuple to packer stream --- diff --git a/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp b/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp index e5802473..ef6c5544 100644 --- a/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp +++ b/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp @@ -32,7 +32,45 @@ namespace type { using std::swap; template< class... Types > - class tuple; + class tuple : public std::tuple { + public: + using base = std::tuple; + + tuple(tuple const&) = default; + tuple(tuple&&) = default; + + template + tuple(OtherTypes&&... other):base(std::forward(other)...) {} + + template + tuple(tuple && other):base(static_cast>(other)) {} + + tuple& operator=(tuple const&) = default; + tuple& operator=(tuple&&) = default; + + template + tuple& operator=(tuple const& other) { + *static_cast(this) = static_cast const&>(other); + return *this; + } + template + tuple& operator=(tuple && other) { + *static_cast(this) = static_cast &&>(other); + return *this; + } + + template< std::size_t I> + typename tuple_element::type& + get() & { return std::get(*this); } + + template< std::size_t I> + typename tuple_element::type const& + get() const& { return std::get(*this); } + + template< std::size_t I> + typename tuple_element::type&& + get() && { return std::get(*this); } + }; template tuple make_tuple(Args&&... args);