Похоже, вы ищете std :: apply (или, может быть, лямбду, заключающую в него вызов + аргументы)
Если ваш вопрос касается C ++ 17 или новееи вместо этого ваши параметры были сохранены в std :: array , решение выглядело бы очень просто:
#include <array>
#include <iostream>
#include <tuple>
int addThreeNumbers(int a, int b, int c)
{
return a+b+c;
}
int main()
{
std::array parameters = {1, 2, 3};
auto f = [&]()
{
return std::apply(addThreeNumbers,parameters);
};
std::cout<<f();
return 0;
}
Как вы и просили в C ++ 11, ваша жизнь будет вечнойтак немного сложнее, так как std :: apply еще не является частью стандартной библиотеки.Нечто подобное, однако, может быть реализовано, связанная страница cppreference даже содержит реализацию, которую можно использовать в значительной степени, как показано: (значительно упрощено для вашего случая, используя константные ссылки вместо правильной совершенной пересылки, чтобы быть более кратким и ясным о намерениях)и используемый метод, без std :: invoke (другое дополнение C ++ 17) и только для массива, чтобы избежать tuple_size (который не был определен для std :: array до C ++ 17))
#include <iostream>
#include <tuple>
int addThreeNumbers(int a, int b, int c)
{
return a+b+c;
}
namespace detail
{
template <class F, class T, std::size_t N, std::size_t... I>
constexpr decltype(auto) apply_impl(const F& f, const std::array<T,N>& t, std::index_sequence<I...>)
{
return f(t[I]...);
}
}
template <class F, class T, std::size_t N>
constexpr decltype(auto) apply(const F& f, const std::array<T,N>& t)
{
return detail::apply_impl(f, t, std::make_index_sequence<N>{});
}
int main()
{
std::array<int,3> parameters= {1, 2, 3};
auto f = [&]()
{
return apply(addThreeNumbers,parameters);
};
std::cout<<f();
return 0;
}
Круто, мы дошли до C ++ 14, но пытаясь скомпилировать это, так как C ++ 11 обнаруживает еще одну проблему: std :: index_sequence был добавлением C ++ 14.К счастью для нас это тоже не было языковым дополнением и может быть реализовано для C ++ 11 (опять же, упрощенная и крайне неэффективная версия, ответ 1016 *, связанный с Aconcagua , содержит многолучшее и подробное объяснение):
template <std::size_t... I>
struct index_sequence{};
namespace detail
{
template <std::size_t N, std::size_t... I>
struct index_sequence_helper
{
using type=typename index_sequence_helper<N-1,N-1,I...>::type;
};
template <std::size_t... I>
struct index_sequence_helper<0,I...>
{
using type=index_sequence<I...>;
};
}
template <std::size_t N>
using make_index_sequence=typename detail::index_sequence_helper<N>::type;
С этим у нас, наконец, есть законченное и работающее решение C ++ 11 для вашего исходного вопроса (с некоторыми более незначительными корректировками, такими как отсутствие вывода типа возврата):
#include <array>
#include <iostream>
int addThreeNumbers(int a, int b, int c)
{
return a+b+c;
}
template <std::size_t... I>
struct index_sequence{};
namespace detail
{
template <std::size_t N, std::size_t... I>
struct index_sequence_helper
{
using type=typename index_sequence_helper<N-1,N-1,I...>::type;
};
template <std::size_t... I>
struct index_sequence_helper<0,I...>
{
using type=index_sequence<I...>;
};
}
template <std::size_t N>
using make_index_sequence=typename detail::index_sequence_helper<N>::type;
namespace detail {
template <class F, class T, std::size_t N, std::size_t... I>
constexpr auto apply_impl(const F& f, const std::array<T,N>& t, index_sequence<I...>) -> decltype(f(t[I]...))
{
return f(t[I]...);
}
}
template <class F, class T, std::size_t N>
constexpr auto apply(const F& f, const std::array<T,N>& t) -> decltype(detail::apply_impl(f, t, make_index_sequence<N>{}))
{
return detail::apply_impl(f, t, make_index_sequence<N>{});
}
int main()
{
std::array<int,3> parameters= {1, 2, 3};
auto f = [&]()
{
return apply(addThreeNumbers,parameters);
};
std::cout<<f();
return 0;
}