C++ 如何通过索引从可变模板参数包中提取值?

C++ 如何通过索引从可变模板参数包中提取值?,c++,templates,c++11,variadic-templates,compile-time-constant,C++,Templates,C++11,Variadic Templates,Compile Time Constant,我想编写一个函数magic\u get,它可以按索引从参数包中提取值,例如: int n = 0; n = magic_get<0>(1, 3, 5, 7); assert(1 == n); n = magic_get<1>(1, 3, 5, 7); assert(3 == n); n = magic_get<2>(1, 3, 5, 7); assert(5 == n); n = magic_get<3>(1, 3, 5, 7); assert(7

我想编写一个函数
magic\u get
,它可以按索引从参数包中提取值,例如:

int n = 0;
n = magic_get<0>(1, 3, 5, 7);
assert(1 == n);
n = magic_get<1>(1, 3, 5, 7);
assert(3 == n);
n = magic_get<2>(1, 3, 5, 7);
assert(5 == n);
n = magic_get<3>(1, 3, 5, 7);
assert(7 == n);
int n=0;
n=魔术(1,3,5,7);
断言(1==n);
n=魔术(1,3,5,7);
断言(3==n);
n=魔术(1,3,5,7);
断言(5==n);
n=魔术(1,3,5,7);
断言(7==n);
如何实现
magic\u get

template <size_t N, typename... Args>
decltype(auto) magic_get(Args&&... as) noexcept {
    return std::get<N>(std::forward_as_tuple(std::forward<Args>(as)...));
}

请注意,这在叮当声中不起作用,这要归功于。将
std::enable_if_t…
替换为
std::enable_if_t=0
是一个简单的解决方法

有可能避免构造元组对象吗?@xmllmx是的,有可能,但是为什么要重新发明轮子呢?优化器将优化所有内容,因为元组是引用的元组,所以它的析构函数很简单。
template <std::size_t N, typename Tfirst, typename... Args, std::enable_if_t<N == 0, int>...>
decltype(auto) magic_get(Tfirst&& first, Args&&... as) noexcept {
    return std::forward<Tfirst>(first);
}

template <std::size_t N, typename Tfirst, typename... Args, std::enable_if_t<N != 0, int>...>
decltype(auto) magic_get(Tfirst&& first, Args&&... as) noexcept {
    return magic_get<N - 1>(std::forward<Args>(as)...);
}