我正試圖在這裏構建線程:Variable length template arguments list? 有一個默認的函子類,這只是學術上的興趣。我的目標是構建一個通用的Fucntor類:給定類名稱,方法名稱和參數類型(可變長度),它構建一個具有operator()方法的類,該方法接受模板參數中指定類型的可變數量的參數,需要一個指針並應用給定的方法。想象一下,一類這樣的:C++中的通用函數類
class MyClass
{
public:
float Fraction(float n, int m)
{
return n/m;
}
int Increment(int n)
{
return n+1;
}
} ;
而且可以在任何這樣的功能可以使用模板化的函數子類:
int k = FunctorClass<MyClass, Increment, int, int /*return type*/> (3);
assert(k == 4);
float l = FunctorClass<MyClass, Fraction, float, int, float, /*return type*/> (4,3);
assert(l == (4/3));
能這樣的函數子類來構建? 旁註:無法使用可變模板,(在VS2010中建立,沒有...模板參數) 感謝您的幫助
謝謝你經過深思熟慮的答案。是的,我的情況是針對非靜態成員,並且必須發送對象。 您能否詳細介紹一下:另外,如果沒有右值引用,您將無法獲得完美的轉發。 ? 再次感謝 – user1186270 2012-02-19 17:30:49
如果函數模板將右值引用作爲參數,那麼C++ 2011支持rvalues引用(某些類型爲'T'拼寫'T &&')和特殊模板推導規則。這允許捕獲參數如何傳遞(即它是來自左值還是來自臨時值)並將其轉發給包裝函數。由於臨時文件可以在不復制的情況下傳遞,因此可以防止某些C++ 2003無法實現的副本。但是,充分的討論是一篇相當長的文章。 – 2012-02-19 22:46:50
@ user1186270:Dietmar是對的。這確實會造成一篇相當長的文章。幸運的是,有人已經在這裏寫下了它:http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx – ForeverLearning 2012-02-23 22:10:52