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)...));
}
如果 C++14 功能不可用,则更decltype(auto)
改为auto
并添加尾随返回类型。decltype(/* the whole returned expression here */)
无元组版本:
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 bug 11723 ,这在 clang 中不起作用。替换std::enable_if_t<N != 0, int>...
为std::enable_if_t<N != 0, int> = 0
是一个简单的解决方法。