Реализация и использование Identity функции

79
22 июня 2021, 05:00

Хотел бы начать с примера, поэтому для начала опишу несколько используемых функций.

Тривиальная функция для композиции других функций:

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);
READ ALSO
c++ stl: пересечение множеств

c++ stl: пересечение множеств

подскажите, есть в stl стандартные средства или какой-то короткий оптимальный способ для решения следующей задачи:

106
C++ move семантика, как реализовать?

C++ move семантика, как реализовать?

Прошу помочь разобраться с реализацией move семантики на моём примере

116
Мне необходимо обнулить (либо поставить единичку) на одну из ножек микроконтроллера

Мне необходимо обнулить (либо поставить единичку) на одну из ножек микроконтроллера

Цель задания: Управлять лампочкой путем (замкнута/разомкнута) контакта преемника, который управляется микроконтроллеромЗадачей зажжением...

76
Как проверить логин и пароль пользователя в linux?

Как проверить логин и пароль пользователя в linux?

Пользователь вводит логин и пароль в консоль программы, есть ли возможность проверить из верность используя с++ linux api или bash?

86