![](/img/trans.png)
[英]Passing a templated functor as an argument to a templated function in C++
[英]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.