Я думал о неявных шаблонах C++ 14, и я пытаюсь объявить функцию для соответствия определенному типу аргумента (SFINAE и черты все еще дают мне головные боли). Я не знаю, как объяснить, что я хочу, но я пытаюсь сделать Y combinator (просто посмотреть, возможно ли это, а не для производства).Как создать комбинатор Y на основе SFINAE в C++?
Я пытаюсь объявить функцию:
template<typename T>
my_traits<T>::return_type Y(T t) {
// ...
};
Такое, что T
является функцией (или функтор), который соответствует
std::function<R(F, Args...)>
// where F (and above return_type) will be
std::function<R(Args...)>
Что бы принять любое количество аргументов, но сначала должна быть функция с тем же возвращаемым типом и теми же аргументами (кроме самой этой функции). Первым параметром для функтора operator()
является шаблон.
Использование я хочу добиться:
auto fib = [](auto myself, int x) {
if(x < 2)
return 1;
return myself(x - 1) + myself(x - 2);
};
// The returned type of fib should be assignable to std::function<int(int)>
Я не был в состоянии принять тип возвращаемого T
типа (из-за перегруженного operator()
). То, что я пытаюсь сделать, возможно? Как я могу это сделать?
Edit:
Видя это с другой точки зрения, я пытаюсь сделать эту работу:
struct my_functor {
template<typename T>
char operator() (T t, int x, float y) { /* ... */ };
};
template<typename T>
struct my_traits {
typedef /* ... */ result_type;
/* ... */
};
// I want this to be std::function<char(int, float)>, based on my_functor
using my_result =
my_traits<my_functor>::result_type;
Применение исправления в предыдущем комментарии, возвращаемый тип вашего 'fib' выводится на' int'.Если я правильно понимаю Y-комбинаторы, они не возвращают функцию, как вы предлагаете, они возвращают элементы в домене их параметра. Я что-то упускаю? – ThomasMcLeod
'сам (x - 1) + себя (x - 2)', как я его написал. Это идея. Lambda будет генерировать 'template int operator() (T, int)', я хочу получить 'int (int)' из него. –
paulotorrens
@ThomasMcLeod, Y-комбинатор принимает нерекурсивную функцию (первый аргумент которой является ее версией без первого аргумента) и возвращает рекурсивную функцию. Поэтому я пытаюсь вывести 'int (int)' из 'int (T, int)'. – paulotorrens