#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>

using namespace std;

template <typename R, typename... ARGS>
R function_return(R(*)(ARGS...));

template <typename R, typename... ARGS>
std::tuple<ARGS...> function_parameters(R(*)(ARGS...));

template <int I, typename T>
using get_type = typename std::conditional_t<(I < 0), std::tuple_element<static_cast<int>(std::tuple_size<T>::value) + I, T>, std::tuple_element<I, T>>::type;

template <int I, typename T>
using parameter_type = get_type<I, decltype(function_parameters(std::declval<T>()))>;

void bar(bool, char, int) {}

int main() {
  const parameter_type<-1, decltype(bar)> foo = 13;

  cout << foo << endl;
}