Как я могу использовать std :: result_of для возврата типа функции вместо void - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь получить возвращаемый тип функции, с которой я связываюсь. В этом случае я ожидал увидеть возвращаемый тип GetFactorialResult (int).

#include <iostream>
#include <boost/core/demangle.hpp>
#include <typeinfo>

namespace
{
    const int testNumber = 10;
    int GetFactorialResult(int number)
    {
        if (number > 1)
        {
            return number * GetFactorialResult(number - 1);
        }
        else
        {
            return 1;
        }
    }

    template <typename Func, typename... Args>
    void Submit(Func&& func, Args&&... args)
    {
        auto boundTask = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);
        using ResultType = typename std::result_of<decltype(boundTask)()>::type;

        char const * name = typeid( ResultType ).name();
        std::cout << boost::core::demangle( name ) << std::endl;
    }
}


int main()
{
    Submit([](int number)
        {
        GetFactorialResult(number);
        }, number);

    return 0;
}

Вывод

void
0

Когда я печатаю тип boundTask, я вижу то, что ожидаю:

std :: _ Bind <\ main :: {lambda (int) # 1} (int)> (обратный слеш не существует, но не может понять, как отобразить его без него).

ПолагаюЯ становлюсь недействительным из-за того, что я делаю decltype(boundTask)(), но если я уберу скобку, она не скомпилируется.

У меня есть доступ только к функциям c ++ 11.

...