代码之家  ›  专栏  ›  技术社区  ›  PowerApp101

在C++中,如何使用模板函数作为STD中的第三个参数:

  •  3
  • PowerApp101  · 技术社区  · 17 年前

    我尝试使用std::for_来输出向量的内容,向量可能包含不同的类型。所以我写了一个通用的输出函数,就像这样:

    template<typename T> void output(const T& val)
    {
        cout << val << endl;
    }
    

    我想将其用于:

    std::for_each(vec_out.begin(), vec_out.end(), output);
    

    但是编译器抱怨在for-each语句中“无法推导模板参数”。还抱怨“函数模板不能是另一个函数模板的参数”。

    这不可能吗?我本以为编译器会知道vec-out(向量)的类型,所以应该实例化函数“output(const double&val)”?

    如果这不起作用,我怎么能在不编写手动循环的情况下获得类似的STL功能呢?

    我对C++非常陌生,仍然在学习窍门:

    3 回复  |  直到 17 年前
        1
  •  9
  •   dirkgently    17 年前

    尝试:

    std::for_each(vec_out.begin(), vec_out.end(), output<T>);
    

    哪里 vec_out 是一个容器( vector T型。

    注: for_each 算法的最后一个参数需要一元函数。有关使用函数的示例,请参见链接。

        2
  •  7
  •   Naveen    17 年前

    您必须传递模板的实例化。类似的东西 output<int> 如果向量是整数向量。

    例如:

    template<typename T> void output(const T& val)
    {
        cout << val << endl;
    }
    
    
    
    void main(int argc,char *argv[])
    {
        std::vector<int> vec_out;
        std::for_each(vec_out.begin(), vec_out.end(), output<int>);
    }   
    
        3
  •  7
  •   James Hopkin    17 年前

    我想补充一下正确的答案:如果您将模板函数包装在一个函数对象(亦称函数)中,编译器可以推断出类型:

    struct OutputFunctor
    {
      template <typename T>
      void operator()(const T& val) const { output(val); }
    };
    
    void test()
    {
      std::vector<int> ints;
      std::vector<float> floats;
    
      std::for_each(ints.begin(), ints.end(), OutputFunctor());
      std::for_each(floats.begin(), floats.end(), OutputFunctor());
    }