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

标签 c++ templates c++11 variadic-templates compile-time-constant

我想写一个函数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/

相关文章:

c++ - 断言由 OpenCV checkVector() 在其他有效 vector<vector<Point3f>> 上抛出

c++ - Vim 中的自动补全

c++ - 从一个模板类到另一个相关模板类的转换运算符

c++ - 通过Boost Fusion获得结构名称

c++ - 模板化类型的格式说明符

c++ - 访问包含它的 vector 元素时,类对象的运算符重载不起作用?

C++ 使用 size_t 与使用无符号整数示例

C++ 重载运算符 < 错误

c++ - 隐式转换中的隐式参数

c++ - 需要帮助理解 ' string ltrim(const string &) ' 的含义