C++ tuple-get_或helper函数

C++ tuple-get_或helper函数,c++,tuples,template-meta-programming,boost-fusion,C++,Tuples,Template Meta Programming,Boost Fusion,我需要一个tuple helper函数,如果请求的类型在tuple中不存在,它将返回一个默认构造的null类型 e、 g std::tuple-tuple(true,0); 静态断言(std::is_same::value,“”); 断言(get_或(tuple)=nullptr); 我想我需要一些助推融合魔法,但我还没有完全弄明白。有什么建议吗?这里有一个tuple\u index助手,它返回std::tuple中给定类型的索引。(它可以很容易地调整以使用谓词,例如是可转换的) 模板 结构元

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

e、 g

std::tuple-tuple(true,0);
静态断言(std::is_same::value,“”);
断言(get_或(tuple)=nullptr);

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

这里有一个
tuple\u index
助手,它返回
std::tuple
中给定类型的索引。(它可以很容易地调整以使用谓词,例如
是可转换的

模板
结构元组索引
:std::积分常数{};
模板
结构元组索引,偏移量>
:std::积分常数,偏移量+1>::值>{};
模板
结构元组索引,偏移量>
:std::积分常数{};
您可以这样构建它:

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 ) );
}
template
typename std::enable_if::type>::value
==std::tuple\u size::type>::value,
回退>::类型
获取或(元组&&t){return{};}
模板
typename std::enable_if::type>::value
!= std::tuple_size::type>::value,
结果>::类型
获取或(元组(&t){
返回std::get::type>::value>
(std::forward(t));
}


所有的
衰减
都是必需的,因为元函数区分
元组
元组&

您不应该编译第一行。您需要传递第二个构造函数参数。@juanchopanza-我认为第一行实际上就是问题所在。他希望能够像这样初始化元组,并将第二个参数设置为default@asafrob啊好的。这个问题提出的方式使我感到震惊。没有任何帮助函数可以修复编译器错误。我认为这是同一个问题@juanchopanza:你是对的。我已经纠正了打字错误。太好了!虽然我希望使用boost mpl或fusion实现一个更简单的助手函数?这已经很简单了,只是由于我复制粘贴的
decation
而变得冗长。你可以通过中间人将其发送出去。而且我有点怀疑
forward
在做什么;我只是防御性地加了一句。
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 ) );
}