tuple-get_or辅助函数

tuple - get_or helper function

本文关键字:函数 or tuple-get      更新时间:2023-10-16

我需要一个元组助手函数,如果元组中不存在请求的类型,它将返回默认构造的null类型。

例如

std::tuple<bool, int> tuple(true, 0);
static_assert(std::is_same<decltype(get_or<double, std::nullptr_t>(tuple)), 
                           std::nullptr_t>::value, "");
assert(get_or<double, std::nullptr_t>(tuple) == nullptr);

我想我需要一些助推融合魔法,但我还没有完全弄清楚。有什么建议吗?

这里有一个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

所有的CCD_ 4都是必要的,因为元函数在tupletuple &之间进行区分。

相关文章: