当返回值是模板类型时如何使用std :: result_of?

时间:2016-11-05 02:20:36

标签: c++ templates 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 个答案:

答案 0 :(得分:1)

g<int>的类型为shared_ptr<int>(),当函数推断时会衰减为指向该类型的指针(shared_ptr<int>(*)())。因此,FunctionType中的submit 是一个模板,您无法在其上使用模板参数。

如果您可以更清楚地知道自己要做什么,我们可以找出解决您主要问题的方法。