解压缩 C 样式数组以及C++中的参数包

Unpack C-style array along with parameter pack in C++

本文关键字:参数 C++ 样式 数组 解压缩      更新时间:2023-10-16

我的问题与此有些相似:我正在使用C++14,我正在尝试"解压缩"一个C风格的数组并调用一个包含其内容的函数。不同之处在于,我需要在可变参数函数模板中执行此操作,并将数组的每个元素传递到依赖于类型参数包的内容中。

以下是简化的代码:

template<typename T>
struct Converter {
static T convert(const char*) {
...
}
};
template<typename ... T>
void myfunction( void(*f)(T...), char* args[]) {
f(Converter<T...>::convert(args[i])...); // this is not correct but illustrates the idea
}

myfunction这里获取一个指向函数的指针,该函数f接受任意数量的 T1 类型参数,...吨。args数组的每个元素在传递给f之前都应转换为相应的类型。

如何在 C++14 中做到这一点?

下面是一个解决方案,用于创建可用于索引args的编译时整数序列:

template<typename ...T, size_t ...I>
void myfunction_impl(void(*f)(T...), char const* args[], std::index_sequence<I...>) {
f(Converter<T>::convert(args[I])...); 
}
template<typename ... T, size_t N>
void myfunction(void(*f)(T...), char const *(&args)[N]) {
static_assert(N == sizeof...(T), "");
myfunction_impl(f, args, std::index_sequence_for<T...>());
}

这是一个演示。

这也使用传入数组的大小,以static_assert它等于传入函数的参数数。