Как использовать std::result_of, когда возвращаемое значение является типом шаблона?

Я пытаюсь использовать result_of для случая, когда Callable возвращает тип шаблона и получить следующую ошибку (clang++). Я также включил простой случай, когда все работает отлично.

Ошибка:

main.cpp:22:50: note: candidate template ignored: could not match '<type-parameter-0-1>' against 'std::__1::shared_ptr<int> (*)()'
typename std::result_of<FunctionType<T>()>::type submit(FunctionType<T> f) {

Код:

    int f() {
      int x = 1;
      return x;
    }

    template<typename T>
    std::shared_ptr<T> g() {
      std::shared_ptr<T> x;
      return x;
    }

    template <template<typename> class FunctionType, typename T>
    typename std::result_of<FunctionType<T>()>::type submit(FunctionType<T> f) {

      using result_type = typename std::result_of<FunctionType<T>()>::type;

      result_type x;
      return x;
    }

      template<typename FunctionType>
      typename std::result_of<FunctionType()>::type submit2(FunctionType f) {

        using result_type = typename std::result_of<FunctionType()>::type;

        result_type x;
        return x;
     }


    int main()
    {   
      submit(g<int>);  // error
      submit2(f);       // ok

      return 0;
    }

1 ответ

Решение

g<int> имеет тип shared_ptr<int>() который при выводе из функции распадается на указатель на этот тип (shared_ptr<int>(*)()). FunctionType в submit поэтому не является шаблоном, и вы не можете использовать аргументы шаблона для него.

Если бы вы могли лучше понять, что вы пытаетесь сделать, мы можем найти решение вашей основной проблемы.

Другие вопросы по тегам