fork download
  1. #include <utility>
  2. #include <tuple>
  3.  
  4. template< typename elem, typename tup, std::size_t offset = 0 >
  5. struct tuple_index
  6. : std::integral_constant< std::size_t, offset > {};
  7.  
  8. template< typename elem, typename head, typename ... tail, std::size_t offset >
  9. struct tuple_index< elem, std::tuple< head, tail ... >, offset >
  10. : std::integral_constant< std::size_t, tuple_index< elem, std::tuple< tail ... >, offset + 1 >::value > {};
  11.  
  12. template< typename elem, typename ... tail, std::size_t offset >
  13. struct tuple_index< elem, std::tuple< elem, tail ... >, offset >
  14. : std::integral_constant< std::size_t, offset > {};
  15.  
  16. template< typename result, typename fallback, typename tuple >
  17. typename std::enable_if< tuple_index< result, typename std::decay< tuple >::type >::value
  18. == std::tuple_size< typename std::decay< tuple >::type >::value,
  19. fallback >::type
  20. get_or( tuple && t ) { return {}; }
  21.  
  22. template< typename result, typename fallback, typename tuple >
  23. typename std::enable_if< tuple_index< result, typename std::decay< tuple >::type >::value
  24. != std::tuple_size< typename std::decay< tuple >::type >::value,
  25. result >::type
  26. get_or( tuple && t ) {
  27. return std::get< tuple_index< result, typename std::decay< tuple >::type >::value >
  28. ( std::forward< tuple >( t ) );
  29. }
  30.  
  31. std::tuple< int, double > x;
  32. double y = get_or< double, void * >( x );
  33. void *z = get_or< char, void * >( x );
  34.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
/usr/lib/gcc/i486-linux-gnu/4.7/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
stdout
Standard output is empty