我一直在从事一个项目,我需要知道到底有没有将函数传递给模板类?可以说我希望它执行窦或余弦功能
#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
答案 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)>
另一种方法是将可调用类型作为模板参数传递,并调用该类型的对象。实际上,这就是您在示例中所做的。