Является ли это хорошим подходом к «сдаче» шаблон функции в качестве универсального-variadic лямбда-оператора возврата?

Я получал удовольствие от попыток передать шаблон функции как 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 или что-то)

3

Решение

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

Итак, это будет:

#define PASS_TEMPLATE(name) [](auto&&... args){return name(decltype(args)(args)...);}

GCC был сломан с общими лямбдами без гражданства, поэтому вы должны были добавить хотя бы минимальное состояние, как [dummy=nullptr] или что-то типа того. К счастью, они это исправили.

3

Другие решения

Это хорошо, за исключением того, что вы, вероятно, захотите включить идеальную пересылку:

#define PASS_TEMPLATE(name) [](auto&&... args){return name(std::forward<decltype(args)>(args)...);}
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector