我想写一个函数magic_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);
如何实现magic_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)...));
}
更改 decltype(auto)
至 auto
并添加 decltype(/* the whole returned expression here */)
的尾随返回类型如果 C++14 功能不可用。
无元组版本:
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)...);
}
请注意,这在 clang 中不起作用,感谢 clang bug 11723 .替换 std::enable_if_t<N != 0, int>...
与 std::enable_if_t<N != 0, int> = 0
是一个简单的解决方法。
关于c++ - 如何通过索引从可变模板参数包中提取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24710389/