如何通过索引从可变参数模板参数包中提取值? [英] How to extract a value from a variadic template parameter pack by index?

查看:195
本文介绍了如何通过索引从可变参数模板参数包中提取值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编写一个函数 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆