不能直接使用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)。
有了这个,可以将任意函数(接受所有元组成员)应用于在运行时选择的元组元素。
为什么这个或类似的东西不在标准库中?我在这里遗漏了一些阻碍正确应用的相关内容吗?