Я предполагаю, что вы можете использовать до самого последнего стандартная версия, поскольку вы не указали ее.
Вот минимальный, рабочий пример:
#include<vector>
#include<functional>
#include<utility>
template<std::size_t... I, typename F, typename... A>
auto gen(std::index_sequence<I...>, F &&f, A... args) {
return std::vector<decltype(std::forward<F>(f)(args...))>{
(I, std::forward<F>(f)(args...))...
};
}
template<std::size_t N, typename F, typename... A>
auto gen(F &&f, A... args) {
return gen(std::make_index_sequence<N>{}, std::forward<F>(f), args...);
}
int f(int, char) { return 0; }
int main() {
auto vec = gen<10>(&f, 0, 'c');
}
Возврат тип вашей функции легко выводится:
decltype(std::forward<F>(f)(args...))
Я хочу создать контейнер, чтобы содержать п вызовы этой функции. Затем я хочу выполнить это много раз.
Для этого я использовал std::index_sequence
для создания пакета параметров, имеющего нужный размер.
Затем сам вектор инициализации, как это следующим образом:
(I, std::forward<F>(f)(args...))...
Основная идея заключается в том, чтобы использовать оператор запятой, чтобы распаковать пакет параметров, упомянутых выше, и выполнять N
раз функцию. Значения, возвращаемые вызовами f
, используются для заполнения вектора.
Отметьте, что args
не переадресованы на f
.
Это может вызвать проблемы в случае перемещения предметов, потребляемых во время первого выполнения.
[Этот вопрос в StackOverflow] (http://stackoverflow.com/questions/11310898/how-do-i-get-the-type-of-a-variable) может ответить на ваш вопрос. – Nietvoordekat
Вы можете взглянуть на решение здесь: http://stackoverflow.com/a/41301717/2378300 – Jonas