C ++ std :: get与运行时参数等效

时间:2015-06-14 11:12:52

标签: c++ templates c++11 tuples

不能直接使用std::get运行时参数:

template<typename Tuple>
void get(size_t i, Tuple const& t)
{
     using std::get;
     std::cout<<get<i>(t)<<std::endl;       //error: 'i' is not a constant expression
}

int main()
{
    std::tuple<int,double> t;
    get(1,t);
}

但是,可以手动将运行时映射到编译时信息:

template<typename Tuple>
void get_impl(size_t i, Tuple const& t, typename std::tuple_size<Tuple>::type) {}

template<size_t N, typename Tuple, typename = std::enable_if_t<std::tuple_size<Tuple>::value != N> >
void get_impl(size_t i, Tuple const& t, std::integral_constant<size_t, N>)
{
    if(i==N)
    {
        std::cout<<std::get<N>(t)<<std::endl;
    }
    else
    {
        get_impl(i, t, std::integral_constant<size_t, N+1>());
    }
}

template<typename Tuple>
void get(size_t i, Tuple const& t)
{
    get_impl(i, t, std::integral_constant<size_t, 0>());
}

对我来说似乎很有帮助(DEMO)。

有了这个,可以将任意函数(接受所有元组成员)应用于在运行时选择的元组元素。

为什么这个或类似的东西不在标准库中?我在这里遗漏了一些阻碍正确应用的相关内容吗?

0 个答案:

没有答案