簡體   English   中英

C ++ Functor作為函數的輸出參數

[英]C++ Functor as an output argument of a function

我想在c ++中編寫一個函數,它接受一個int類型的變量,它的作用是它將定義一個仿函數的重載operator(),並將該函數作為輸出參數返回。 例如:

template<class Functor>
Functor myFunc(double n)
{
   Functor f; 
   double Functor::operator() (double q) 
   { return n*q;} 
   return Functor; 
} 
class myClass 
{ 
  double operator() ( double q ) const ;
};

這樣做是否正確?

對於你想要做的事情(錯誤的),有一種語法糖。 它被稱為lambda表達式 ,它應該是這樣的:

auto myFunc(double n)
{
    return [n](double q) { return n * q; }
}

如果C ++ 11不可用,您可以像這樣模擬它(它修復了上面的錯誤):

class Functor
{
    double m_n;

public:
    Functor(double n) : m_n(n) {}

    double operator()(double q) const { return m_n * q; }
};

Functor myFunc(double n)
{
    return Functor(n);
}

如果你願意,你可以保持myFunc作為模板,但關鍵是,你可以通過傳入的仿函數改變行為,所以嘗試在myFunc中硬編碼operator()並不是真的有意義,而且是不可能的。


使它更通用:

template <typename T>
class Functor
{
    T m_n;

public:
    Functor(T n) : m_n(n) {}

    T operator()(T q) const { return m_n * q; }
};

template <template <typename> class Functor, typename T>
auto myFunc(T n)
{
    // we can use perfect forwarding here, but it's far beyond the original question
    return Functor<T>(n);
}

用法:

myFunc<Functor>(2)(3)

對於由仿函數捕獲的可變數量的參數(可變參數模板),更通用:

template <template <typename ...> class Functor, typename ... Ts>
auto myFunc(Ts ... ns)
{
    return Functor<Ts...>(ns...);
}

暫無
暫無

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

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