Как сделать возможность автоматического выведения типа аргумента-функции? C++

Есть такой шаблонный метод, который принимает std::function:

#include <functional>

template<typename C>
class Deduce
{

    C c = 0;

public:

    template<typename R>
    C then(const std::function<R(C)>& func) {

        return func(c);

    }

};

Можно ли сделать так, чтобы при вызове метода не приходилось писать тип возвращаемого значения явно: obj.my_method<my_type>(func)? Я видел код, где этот тип автоматически выводился из типа возвращаемого значения аргумента-функции. Где можно почитать про это?


Ответы (1 шт):

Автор решения: user7860670

Для этого достаточно будет использовать автоматическое выведение типа возвращаемого значения функции:

#include <iostream>

template<typename C>
class Deduce
{
    private: C c{42};

    public: template<typename x_Invocable>
    auto then(x_Invocable && invocable)
    {
        return invocable(c);
    }
};

int increment(int i)
{
    return i + 1;
}

int main()
{
    Deduce<int> deduce{};
    std::cout << deduce.then(increment) << "\n";
    return 0;
}

online compiler

→ Ссылка