我正在尝试提出一个模板,以使用由迭代器生成的参数来调用函数。这是一个示例:
// 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来完成此任务。
答案 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中从左到右。