gpt4 book ai didi

c++ - 固定大小的容器到可变参数模板参数列表的转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:14 24 4
gpt4 key购买 nike

我必须调用一个可变模板函数,它可以接受任意数量的参数。

template < class ... Args >
void f( Args&... args);

我想写一个小的包装函数,这样我就可以用固定大小的容器(如 std::array)中包含的 N 个相同类型的参数调用 f

目标是写类似的东西

std::array<int, 3> arr = {1,2,3};
wrapper(arr); // calls f(1,2,3);

我尝试使用初始化列表和 std::forward 的某种组合,但无济于事。有没有办法实现我想要的?

最佳答案

如果您的编译器支持 C++14,您可以按以下方式进行:

template <class ... Args>
void f(Args&&... args) {
...
}

template<typename T, std::size_t N, std::size_t... I>
void wrapper_impl(std::array<T, N> const &arr, std::index_sequence<I...>) {
f(arr[I]...);
}

template<typename T, std::size_t N,
typename Indices = std::make_index_sequence<N>>
void wrapper(std::array<T, N> const &arr) {
wrapper_impl(arr, Indices());
}

Live Demo

基于此 SO answer 的 C++11你可以编写一些额外的机器并按如下方式进行(虽然还没有测试):

namespace detail {
template<std::size_t... Is> struct seq {};
template<std::size_t N, int... Is> struct gen_seq : gen_seq<N-1,N-1, Is...> {};
template<std::size_t... Is> struct gen_seq<0, Is...> : seq<Is...> {};
}

template <class ... Args>
void f(Args&&... args) {
...
}

template<typename T, std::size_t N, std::size_t... I>
void wrapper_impl(std::array<T, N> const &arr, detail::seq<I...>) {
f(arr[I]...);
}

template<typename T, std::size_t N>
void wrapper(std::array<T, N> const &arr) {
wrapper_impl(arr, detail::gen_seq<N>());
}

Live Demo

关于c++ - 固定大小的容器到可变参数模板参数列表的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35232057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com