Хотел бы начать с примера, поэтому для начала опишу несколько используемых функций.
Тривиальная функция для композиции других функций:
template<typename R1, typename ...Args, typename R2>
decltype(auto) compose(std::function<R2(R1)> g, std::function<R1(Args...)> f)
{
return [=](Args... arg) { return g(f(arg...)); };
}
Перегруженный оператор << (для удобства):
template<typename R1, typename ...Args, typename R2>
decltype(auto) operator << (std::function<R2(R1)> g, std::function<R1(Args...)> f)
{
return compose(g, f);
}
Вспомогательная функция для создания экземпляра std::function
из указателя на функцию:
template<typename R, typename ...Args>
decltype(auto) make_function(R(*f)(Args...))
{
return std::function<R(Args...)>(f);
}
Identity функция:
template<typename T>
decltype(auto) identity(T&& arg)
{
return std::forward<T>(arg);
}
Собственно, пример:
int f(char c);
double g(int i);
int main()
{
auto r1 = make_function(g) << make_function(f);
auto r2 = make_function(f) << /* ? (здесь нужно использовать Id(char)) */;
std::cout << typeid(r1).name() << std::endl;
std::cout << typeid(r2).name() << std::endl;
}
Получить композицию функций f и g не составило труда, а вот композицию f и identity(char) - здесь мне не понятно, как я могу использовать функцию identity, ведь она шаблонная и я не могу получить указатель на нее, соответственно, не могу получить необходимый экземпляр std::function
.
UPD0: вариант с лямбда-функцией
Если использовать предложенную @HolyBlackCat реализацию identity:
auto identity = [](auto &&arg) -> decltype(auto) { return decltype(arg)(arg); };
и дополнительно перегрузить функцию compose:
template<typename R1, typename ...Args, typename F>
decltype(auto) compose(std::function<R1(Args...)> f, F id)
{
return [=](Args... arg) { return f(id(std::move(arg...))); };
}
становится возможным использование последней следующим образом:
compose(make_function(f), identity);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
подскажите, есть в stl стандартные средства или какой-то короткий оптимальный способ для решения следующей задачи:
Прошу помочь разобраться с реализацией move семантики на моём примере
Цель задания: Управлять лампочкой путем (замкнута/разомкнута) контакта преемника, который управляется микроконтроллеромЗадачей зажжением...
Пользователь вводит логин и пароль в консоль программы, есть ли возможность проверить из верность используя с++ linux api или bash?