Что еще мне нужно, чтобы использовать вариационное наследование шаблонов для создания лямбда-перегрузок?

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

Я понимаю, что лямбды могут быть написаны, чтобы принимать определенные типы, а затем возвращать определенные типы. Имейте в виду, что я все еще изучаю C ++ 14 и C ++ 11, поэтому я не освоил ни то, ни другое.

Здесь была моя попытка взглянуть на Другой Вопросы переполнения стека:

// For std::string
#include <string>

// For std::cout
#include <iostream>//Create a generalized list instantiation
template <typename ... F>
struct overload : public F... {
overload(F... f) : F(f)... {}
};

//Create an specific end-case, where we directly
//inherit the () operator in order to inherit
//multiple () overloads
template <typename F>
struct overload : F {
using F::operator();
};//template function to create an overload
template <class... F>
auto make_overload(F... f) {
return (f...);
}

int main() {
auto f = [](int x,int y) -> int {
return x+y;
};
auto g = [](double x,double y) -> int {
return std::ftoi(x+y);
};
auto h = [](std::string x,std::string y) -> int {
return std::stoi(x+y);
};

//Ah, but this is a function.
auto fgh = make_overload(f,g,h);

std::cout << (fgh(1,2)) << std::endl;
std::cout << (fgh(1.5,2.5)) << std::endl;
std::cout << (fgh("bob","larry")) << std::endl;
}

Coliru: http://coliru.stacked-crooked.com/a/5df2919ccf9e99a6

Что мне здесь концептуально не хватает? Другие ответы могут кратко ответить на эту проблему за чистую монету, но я ищу объяснение, почему ответ ускользает от моего мышления. Если я понимаю, что мне нужно сделать using F::operator() чтобы унаследовать операторы, и я правильно заявляю, что возвращаемый тип и тип параметра различаются, что еще мне нужно сделать, чтобы эта работа работала?

Вот мой ход мыслей:

  1. Создайте общий базовый класс для шаблона
  2. Создайте конкретный случай шаблона, чтобы перегрузить определенные лямбды operator(),
  3. Создайте вспомогательную функцию для получения списка аргументов шаблона переменной, а затем используйте его для создания класса «перегрузки».
  4. Убедитесь, что типы однозначны.

5

Решение

Вы на самом деле не вернулись.

// primary template; not defined.
template <class... F> struct overload;

// recursive case; inherit from the first and overload<rest...>
template<class F1, class... F>
struct overload<F1, F...> : F1, overload<F...> {
overload(F1 f1, F... f) : F1(f1), overload<F...>(f...) {}

// bring all operator()s from the bases into the derived class
using F1::operator();
using overload<F...>::operator();
};

// Base case of recursion
template <class F>
struct overload<F> : F {
overload(F f) : F(f) {}
using F::operator();
};
4

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


По вопросам рекламы [email protected]