Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Не могу понять, что у вас за постановка задачи, что обычные плюсовые лямбды не подошли в качестве делегатов. Не оптимально, но всяко лучше, чем использовать std::any или RTTI.
Я возможно что то не так понял, но чем это отличается от std::bind?
Просто он много смотрел в исходники стандартной библиотеки, где такие имена используются повсеместно :-)
Я тем самым пытаюсь показать пользователю, что использовать этот класс напрямую не стоит, так как это будет очень «грязно».
Отталкиваясь от примера, не вижу где здесь делегаты. Мне кажется, вы смешиваете несколько проблем в одну. Если вам просто нужно превратить массив any в tuple<>, так и сделайте. Имея такую основу, всё становится проще. Вот несколько строчек:
#include <vector>
#include <any>
#include <tuple>
template<typename... Args>
struct Binder
{
static std::tuple<Args...> convert_args(std::vector<std::any> any_args)
{
auto convert = [i = 0u, &any_args](auto& arg) mutable
{
arg = std::any_cast<decltype(arg)>(any_args.at(i));
++i;
};
std::tuple<Args...> vs;
std::apply([&](Args& ... args) { (convert(args), ...); }, vs);
return vs;
}
template<typename F>
decltype(auto) call(F f, std::vector<std::any> args) const
{
return std::apply(std::move(f), convert_args(std::move(args)));
}
};
#include <string>
#include <iostream>
int f(int a, std::string s)
{
std::cout << "int: " << a << "\nstring: " << s << std::endl;
return 1;
}
int main()
{
return Binder<int, std::string>().call(
f, {5, std::string("Hello, Delegates!")});
}
Мой подход к реализации делегатов в C++: вызов функции с неизвестными параметрами во время выполнения