diff options
Diffstat (limited to 'deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp')
-rw-r--r-- | deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp b/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp new file mode 100644 index 0000000000..572c973c4e --- /dev/null +++ b/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp @@ -0,0 +1,57 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP +#define TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP + +#include <cstddef> +#include <type_traits> + +#include "make_integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + // based on http://stackoverflow.com/questions/18942322 + + namespace impl + { + template< std::size_t > + struct any + { + any( ... ); + }; + + template< typename > + struct wrapper; + + template< typename > + struct unwrap; + + template< typename T > + struct unwrap< wrapper< T > > + { + using type = T; + }; + + template< typename > + struct get_nth; + + template< std::size_t... Is > + struct get_nth< index_sequence< Is... > > + { + template< typename T > + static T deduce( any< Is & 0 >..., T*, ... ); + }; + } + + template< std::size_t I, typename... Ts > + using type_by_index = impl::unwrap< decltype( impl::get_nth< make_index_sequence< I > >::deduce( std::declval< impl::wrapper< Ts >* >()... ) ) >; + + template< std::size_t I, typename... Ts > + using type_by_index_t = typename type_by_index< I, Ts... >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP |