[英]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
類型的對象,因為它是抽象的。 我可以傳遞一個指向函數的指針,但是使用f
像f->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()
應該在基類中是虛擬的(在復制到問題時可能會被遺漏? - 沒有virtual
, pure-specifier =0
)
如果您嘗試通過運行時多態實現它,則需要以下內容
基類函數應聲明為virtual
(它在哪里?)
class func_double_double_t : public unary_function<double, double> { virtual double operator()(double x) = 0; };
從基類繼承時派生類不需要virtual
(為什么要把它放在那里?)
class func_pow_t : public func_double_double_t { ...
調用函數應該通過指針或引用接收對象
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.