これは私が横たわっているtuple_index
ヘルパーで、特定の型のインデックスを a に返しますstd::tuple
。( などの述語で動作するように簡単に調整できますis_convertible
。)
template< typename elem, typename tup, std::size_t offset = 0 >
struct tuple_index
: std::integral_constant< std::size_t, offset > {};
template< typename elem, typename head, typename ... tail, std::size_t offset >
struct tuple_index< elem, std::tuple< head, tail ... >, offset >
: std::integral_constant< std::size_t, tuple_index< elem, std::tuple< tail ... >, offset + 1 >::value > {};
template< typename elem, typename ... tail, std::size_t offset >
struct tuple_index< elem, std::tuple< elem, tail ... >, offset >
: std::integral_constant< std::size_t, offset > {};
次のように構築できます。
template< typename result, typename fallback, typename tuple >
typename std::enable_if< tuple_index< result, typename std::decay< tuple >::type >::value
== std::tuple_size< typename std::decay< tuple >::type >::value,
fallback >::type
get_or( tuple && t ) { return {}; }
template< typename result, typename fallback, typename tuple >
typename std::enable_if< tuple_index< result, typename std::decay< tuple >::type >::value
!= std::tuple_size< typename std::decay< tuple >::type >::value,
result >::type
get_or( tuple && t ) {
return std::get< tuple_index< result, typename std::decay< tuple >::type >::value >
( std::forward< tuple >( t ) );
}
http://ideone.com/ZdoWI7
メタ関数はと をdecay
区別するため、すべてが必要です。tuple
tuple &