C++ 使用迭代器中的参数调用函数的模板

C++ 使用迭代器中的参数调用函数的模板,c++,C++,我正试图找到一个模板,用迭代器生成的参数调用函数。以下是一个例子: // These are some functions to be called. void f(int x) { ... } void f(int x, int y) { ... } void f(int x, int y, int z) { ... } // This is a template to call functions. template<typename I, size_t n> void app

我正试图找到一个模板,用迭代器生成的参数调用函数。以下是一个例子:

// These are some functions to be called.
void f(int x) { ... }
void f(int x, int y) { ... }
void f(int x, int y, int z) { ... }

// This is a template to call functions.
template<typename I, size_t n> void apply(I iterator) {
  int a_1 = *iterator;
  int a_2 = *++iterator;
  ...
  int a_n = *++iterator;
  f(a_1, a_2,...a_n);
}

// This is an example of a function call.
apply<iterator, 2>(i);
//这些是要调用的函数。
void f(int x){…}
空f(int x,int y){…}
空f(intx,inty,intz){…}
//这是一个调用函数的模板。
模板无效应用(I迭代器){
int a_1=*迭代器;
int a_2=*++迭代器;
...
int a_n=*++迭代器;
f(a_1,a_2,…a_n);
}
//这是函数调用的一个示例。
适用(i);
如果我的迭代器是随机访问迭代器,则此任务可以通过以下方式完成:

template<typename I, size_t ...a> void apply(I iterator) {
  f(*(iterator + a)...);
}

apply<iterator, 0, 1>(i);
模板无效应用(I迭代器){
f(*(迭代器+a)…);
}
适用(i);

我想知道是否有一种简单的方法来完成这项任务。

您可以这样做:

template <typename It, size_t ...Is>
decltype(auto) apply_impl(std::index_sequence<Is...>, It& iterator) {
    decltype(*iterator) values[] = {(static_cast<void>(Is), *iterator++)...};
    return f(values[Is]...);
}

template <size_t N, typename It>
decltype(auto) apply(It& iterator) {
    return apply_impl(std::make_index_sequence<N>(), iterator);
}

但在初始值设定项列表中,求值顺序是从左到右。

好的解决方案。也许值得一提的是,解释为什么必须通过数组传递参数值。@richardhoges:note补充道。
f((Is, *iterator++)...); // Incorrect, even in C++17