簡體   English   中英

C ++中的抽象函數

[英]Abstract Functors in C++

我想寫一個抽象基類

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類型的對象,因為它是抽象的。 我可以傳遞一個指向函數的指針,但是使用ff->operator()(num)似乎首先違背了運算符重載的精神。 (*f)(num)更好,但仍然。)

有沒有辦法讓運算符重載和這樣的抽象很好地一起玩?

您只需將引用傳遞給您的函數:

double make_some_calculation(double num, func_double_double_t& f)
{
    return f(x);
}

雖然你可以通過傳遞函數作為參考來實現,但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);

似乎顯而易見的答案是傳遞引用,所以你只需使用: f(num) ,就像平常一樣。

除非您需要能夠在運行時使用不同的函數對象(例如,具有不同類型的仿函數數組,並在循環中調用它們),否則您可能會考慮將函數調用為模板參數:

template <class F>
double do_some_calculation(double num) { 
    return f(num);
}

如果在編譯時已知要使用的函數,則通常是首選。

您可能想要重新審視幾個基本概念。 首先,您的問題的直接答案是您應該傳遞一個引用 ,它允許良好的語法並傳遞不同的派生實例。

除此之外,如果你想要運行時多態行為,那么你的operator()應該在基類中是虛擬的(在復制到問題時可能會被遺漏? - 沒有virtualpure-specifier =0

如果您嘗試通過運行時多態實現它,則需要以下內容

  1. 基類函數應聲明為virtual (它在哪里?)

     class func_double_double_t : public unary_function<double, double> { virtual double operator()(double x) = 0; }; 
  2. 從基類繼承時派生類不需要virtual (為什么要把它放在那里?)

     class func_pow_t : public func_double_double_t { ... 
  3. 調用函數應該通過指針或引用接收對象

     double make_some_calculation(double num, func_double_double_t& f) { return f(x); } 

    要么

     double make_some_calculation(double num, func_double_double_t* f) { return (*f)(x); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM