Я получал удовольствие от попыток передать шаблон функции как template template
аргумент. Конечно, C ++ не позволяет передавать шаблоны функций таким способом. Но я придумал простой хакс:
#include <iostream>
#define PASS_TEMPLATE(name) [](auto&... args){return name(args...);}
template <typename T, typename S>
void function_template(T t, S s) {std::cout << t << ' ' << s << std::endl;}
template <typename Hax, typename T, typename S>
auto test(Hax hax, T t, S s)
{
return hax(t, s);
}
int main()
{
test(PASS_TEMPLATE(function_template), 1, 1.5);
}
Вопрос в том:
Я тестировал это только на GCC 6.1.0 (я действительно надеюсь, что это не расширение GCC или что-то)
Я рекомендую использовать идеальную переадресацию, но, кроме того, это вполне жизнеспособный (и, вероятно, единственный, кроме ручного ввода всего этого) подход к проблеме.
Итак, это будет:
#define PASS_TEMPLATE(name) [](auto&&... args){return name(decltype(args)(args)...);}
GCC был сломан с общими лямбдами без гражданства, поэтому вы должны были добавить хотя бы минимальное состояние, как [dummy=nullptr]
или что-то типа того. К счастью, они это исправили.
Это хорошо, за исключением того, что вы, вероятно, захотите включить идеальную пересылку:
#define PASS_TEMPLATE(name) [](auto&&... args){return name(std::forward<decltype(args)>(args)...);}