LINUX.ORG.RU

История изменений

Исправление Kuzy, (текущая версия) :

Если второй аргумент определить через шаблонный тип, все должно получиться, но мне в конечном счете хочется получить синоним (typedef или еще как) типа такой функции, а там шаблоны вроде как не сработают.

Ты хочешь генерить тип этой функции? Он должен когда-то заканчиваться, или функции должны генериться в зависимости от переданных аргументов?

Это норм?

template <typename S, typename R, typename... Args>
struct get_rec {
	using type = std::function<R(Args..., S)>;
	using next = get_rec<type, R, Args...>;
};

template <typename R, typename... Args>
struct rec_start {
	using type = std::function<R(Args...)>;
	using next = get_rec<type, R, Args...>;
};

-> rec_start<void, int>::type
std::function<void (int)>

-> rec_start<void, int>::next::type
std::function<void (int, std::function<void (int)>)>

-> rec_start<void, int>::next::next::type
std::function<void (int, std::function<void (int, std::function<void (int)>)>)>

-> rec_start<void, int>::next::next::next::type
std::function<void (int, std::function<void (int, std::function<void (int, std::function<void (int)>)>)>)>

Исходная версия Kuzy, :

Если второй аргумент определить через шаблонный тип, все должно получиться, но мне в конечном счете хочется получить синоним (typedef или еще как) типа такой функции, а там шаблоны вроде как не сработают.

Ты хочешь генерить тип этой функции? Он должен когда-то заканчиваться, или функции должны генериться в зависимости от переданных аргументов?

Это норм?

template <typename S, typename R, typename... Args>
struct get_rec {
	using type = std::function<R(Args..., S)>;
	using next = get_rec<type, R, Args...>;
};

template <typename R, typename... Args>
struct rec_start {
	using type = std::function<R(Args...)>;
	using next = get_rec<type, R, Args...>;
};

-> rec_start<void, int>::type
std::function<void (int)>
-> rec_start<void, int>::next::type
std::function<void (int, std::function<void (int)>)>
-> rec_start<void, int>::next::next::type
std::function<void (int, std::function<void (int, std::function<void (int)>)>)>
-> rec_start<void, int>::next::next::next::type
std::function<void (int, std::function<void (int, std::function<void (int, std::function<void (int)>)>)>)>