這裏是一個tuple_index
助手我躺在附近,它返回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
是必要的,因爲metafunctions歧視tuple
和tuple &
。
你的第一行不應該編譯。你需要傳遞第二個構造函數參數。 – juanchopanza
@juanchopanza - 我認爲第一行實際上是個問題。他希望能夠像這樣初始化元組,並將第二個參數設置爲默認值 – asafrob
@asafrob Ah OK。問題出現的方式給我帶來了麻煩。沒有幫助函數可以解決編譯器錯誤。 – juanchopanza