我想写一个抽象的基类
class func_double_double_t : public unary_function<double, double>
{
virtual double operator()(double x) = 0;
};并将其专用于几种不同的类型
class func_pow_t : public func_double_double_t
{
public:
func_pow_t(double exponent) : exponent_(exponent) {};
virtual double operator()(double x) { return pow(x, exponent_); };
}
class func_exp_t : public func_double_double_t
...并在必要时将这些内容传递给函数:
double make_some_calculation(double num, func_double_double_t f)
{
return f(x);
}但是我不能定义func_double_double_t类型的对象,因为它是抽象的。我可以传递一个指向函数的指针,但是使用像f->operator()(num)这样的f似乎从一开始就违背了操作符重载的精神。((*f)(num)更好,但仍然如此。)
有没有办法让操作符重载和这样的抽象很好地结合在一起?
发布于 2012-07-06 04:19:03
您可以简单地将引用传递到您的函数中:
double make_some_calculation(double num, func_double_double_t& f)
{
return f(x);
}发布于 2012-07-06 04:22:31
尽管您可以通过将函数作为引用传递来实现此目的,但C++11标准内置了这些函数器类型:
double make_some_calculation(double d, std::function< double(double) > f) {
return f(d);
}
...
auto add_2=std::bind( std::plus(), 2.0 );
double result=make_some_calculation(1.1, add_2);发布于 2012-07-06 04:19:01
似乎最明显的答案是传递一个引用,所以你只需像往常一样使用:f(num)即可。
除非您需要能够在运行时使用不同的函数对象(例如,拥有不同类型的函数数组,并在循环中调用它们),否则您可以考虑将要调用的函数设置为模板参数:
template <class F>
double do_some_calculation(double num) {
return f(num);
}如果要使用的函数在编译时是已知的,这通常是首选的。
https://stackoverflow.com/questions/11351928
复制相似问题