无论如何有传递函数作为模板参数?

时间:2019-11-15 15:19:31

标签: c++

我一直在从事一个项目,我需要知道到底有没有将函数传递给模板类?可以说我希望它执行窦或余弦功能

#ifndef INTEGRAL_H
#define INTEGRAL_H

template<class F>
class Integral
{
    public:
        Integral( F func):f_(func){}
        ~Integral()=default;
         Integral(){
            int a,b,N;
            double h=(b-a)/N;
            sum=0.0;
            for (size_t j=0; j<N;++j)
                {
                sum+=f_(a+j*h); // here i would like to perform sin(a+j*h) or cosinus or somethingelse
                }

            sum*=h;

        }

        double Sum(){return sum;}

    private:
        F f_;
        double sum;

};

#endif // INTEGRAL_H

3 个答案:

答案 0 :(得分:3)

您的代码按“编码方式”工作(在构造函数中进行少量修复后,与问题无关)。但是std::sin并没有命名单个函数,因此您不能直接将其传递到Integral中。最简单的方法是将其包装为lambda:

Integral i([](auto arg) { return std::sin(arg); });
double value = i.Sum();

如果您的编译器不支持template argument deduction(自C ++ 17起可用),则您必须更加冗长:

auto my_sin = [](auto arg) { return std::sin(arg); };
Integral<decltype(my_sin)> i(my_sin);
double value = i.Sum();

答案 1 :(得分:1)

这可能会有所帮助:Function passed as template argument

最后,函数不过是内存中特定位置的地址,而地址可以归结为一个简单的数字,而这正是模板系统所支持的。

但是,在您的情况下,我建议您仅将std::function对象(它是美化的函数指针)作为常规参数传递给您的函数-无需模板(至少在此功能部分中如此)

答案 2 :(得分:1)

  

总有传递函数作为模板参数吗?

是的。示例:

template<return_type (template_argument_name)(argument_list)>

另一种方法是将可调用类型作为模板参数传递,并调用该类型的对象。实际上,这就是您在示例中所做的。