2

我在 BOOST 中使用了一些数值积分包(参见下面的代码)。任何人都可以解释以下含义:

double operator()(double x) {return x/std::log(x);}

这是什么“运算符()(双x)”?

quadrature::adaptive()(f(), 0., 1., answer, error_estimate);

这里的“f()”是什么?


#include <boost/numeric/quadrature/adaptive.hpp>
#include <boost/numeric/quadrature/kronrodgauss.hpp>
#include <iostream>
#include <cmath>

namespace quadrature=boost::numeric::quadrature;

struct f
{
  double operator()(double x) const { return x/std::log(x); }
};


int main()
{
  double answer, error_estimate;
  // integrate x/log(x) on [0,1]
  quadrature::adaptive()(f(), 0., 1., answer, error_estimate);

  std::cout << "integtral(x/log(x)) on [0,1] is " << answer
            << " with error estimate " << error_estimate
            << std::endl;

  return EXIT_SUCCESS;
}
4

2 回答 2

2

f是一个仿函数,即定义一个operator(). 这意味着此类的实例可以像函数一样使用:

f myinstance;
myinstance(2.3);

当用作函数时operator()定义实例的签名和行为,即它提供了在应用于参数时执行的实际函数的定义。fmyinstance

意思是:使用默认构造函数f()创建一个匿名实例。f即它的工作方式与f myinstance我上面的示例一样,只是创建的实例没有名称。

如您所见, 的实例f作为参数传递给adaptive调用。在内部,此实例随后作为函数应用于各种对象。换句话说,整个机制使您能够定义一个函数(以仿函数的形式,如f)并将其作为参数传递。

于 2012-12-12T04:27:24.427 回答
1

operator()是 C++ 函数调用运算符。这意味着您可以将参数括号应用于类的对象,然后调用该运算符。

关于f(),大概是struct f您在下面显示的 的实例化。

你需要一本 C++ 教科书

于 2012-12-12T04:24:14.160 回答