如何通过索引从可变参数模板参数包中提取值? [英] How to extract a value from a variadic template parameter pack by index?
本文介绍了如何通过索引从可变参数模板参数包中提取值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想编写一个函数 magic_get
,该函数可以按索引从参数包中提取一个值,例如:
I want to write a function magic_get
, which can extract a value from a parameter pack by index, for example:
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(/ *这里整个返回表达式* /)
C ++ 14功能不可用。
Change decltype(auto)
to auto
and add a trailing return type of decltype(/* the whole returned expression here */)
if C++14 features are unavailable.
无元组版本:
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 。将 std :: enable_if_t< N!= 0,int> ...
替换为 std :: enable_if_t< N!= 0,int> = 0
是一个简单的解决方法。
Note that this does not work in clang, thanks to clang bug 11723. Replacing std::enable_if_t<N != 0, int>...
with std::enable_if_t<N != 0, int> = 0
is a simple workaround.
这篇关于如何通过索引从可变参数模板参数包中提取值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文