首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中的抽象函数式

C++中的抽象函数式
EN

Stack Overflow用户
提问于 2012-07-06 04:15:38
回答 5查看 1K关注 0票数 3

我想写一个抽象的基类

代码语言:javascript
运行
复制
class func_double_double_t : public unary_function<double, double>
{
    virtual double operator()(double x) = 0;
};

并将其专用于几种不同的类型

代码语言:javascript
运行
复制
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
...

并在必要时将这些内容传递给函数:

代码语言:javascript
运行
复制
double make_some_calculation(double num, func_double_double_t f)
{
     return f(x);
}

但是我不能定义func_double_double_t类型的对象,因为它是抽象的。我可以传递一个指向函数的指针,但是使用像f->operator()(num)这样的f似乎从一开始就违背了操作符重载的精神。((*f)(num)更好,但仍然如此。)

有没有办法让操作符重载和这样的抽象很好地结合在一起?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-06 04:19:03

您可以简单地将引用传递到您的函数中:

代码语言:javascript
运行
复制
double make_some_calculation(double num, func_double_double_t& f)
{
    return f(x);
}
票数 3
EN

Stack Overflow用户

发布于 2012-07-06 04:22:31

尽管您可以通过将函数作为引用传递来实现此目的,但C++11标准内置了这些函数器类型:

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2012-07-06 04:19:01

似乎最明显的答案是传递一个引用,所以你只需像往常一样使用:f(num)即可。

除非您需要能够在运行时使用不同的函数对象(例如,拥有不同类型的函数数组,并在循环中调用它们),否则您可以考虑将要调用的函数设置为模板参数:

代码语言:javascript
运行
复制
template <class F>
double do_some_calculation(double num) { 
    return f(num);
}

如果要使用的函数在编译时是已知的,这通常是首选的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11351928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档