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

时间:2019-02-15 17:41:53

标签: 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 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);

如果我的迭代器是随机访问迭代器,则可以按以下方式完成此任务:

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

apply<iterator, 0, 1>(i);

我想知道是否可以通过简单的input iterator来完成此任务。

1 个答案:

答案 0 :(得分:3)

您可能会做类似的事情:

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);
}

注意:不保证函数调用中的求值顺序,因此

f((Is, *iterator++)...); // Incorrect, even in C++17

但是评估顺序在initializer_list中从左到右。