Похоже, вы хотите инициализировать по умолчанию объект типа, который данная функция ожидает в качестве аргумента.
Вы не можете сделать это с помощью auto
, но вы могли бы написать черту, чтобы извлечь тип функция ожидает, а затем использовать, чтобы объявить переменную:
namespace detail {
//expects the argument number and a function type
template <std::size_t N, typename Func>
struct arg_n;
//does all the work
template <std::size_t N, typename Ret, typename... Args>
struct arg_n <N, Ret (Args...)> {
using type = std::remove_reference_t<
std::tuple_element_t<N, std::tuple<Args...>>
>;
};
}
//helper to make usage neater
template <std::size_t N, typename Func>
using arg_n = typename detail::arg_n<N, Func>::type;
Тогда вы используете его так:
//type of the first argument expected by foo
arg_n<0,decltype(foo)> a{};
foo(a);
Конечно, как только вы перегружаете функцию, все это терпит неудачу.
Я так не думаю .. Что произойдет, если вы добавите перегрузку в 'foo'? –
Если вы не знаете тип 'a' при написании программы, у вас есть невозможная проблема. Для функции решение является шаблоном, но вам нужно знать тип переменной, которую вы объявляете, так или иначе. –
Простой ответ - нет (BTW Что вы имеете в виду, объединив их в одно предложение). –