2009-12-19 198 views
2

我正在嘗試編寫一個模板,它將函數指針的類型作爲templateargument和相應的函數指針作爲函數參數獲取,因此作爲一個簡單的示例,我正在執行此操作:使用函數指針的類型作爲模板參數

int myfunc(int a) 
{ return a; } 

template<typename T, typename Func> struct Test 
{ 
    typedef typeof(myfunc) Fun; 
    static T MyFunc(T val, Func f) 
    { 
     return f(val); 
    } 
}; 

int main(void) 
{ 
    std::cout<<Test<int, typeof(myfunc)>::MyFunc(5, myfunc)<<std::endl; 
} 

但是,這段代碼立即崩潰。如果我將f的類型更改爲Fun,它可以很好地工作。 那麼我做錯了什麼,我該如何得到這個工作?

我在windows vista下使用mingw,如果行爲是編譯器依賴的情況。

+1

typeof不是C++的一部分,所以甚至沒有在我的編譯器上編譯 – 2009-12-19 20:42:32

+0

在這裏完美編譯和運行。 – 2009-12-19 20:44:21

+0

'typeof'是GCC的擴展。我假設它在MSVC上不可用。 – ZoogieZork 2009-12-19 20:54:55

回答

2

你並不真的需要Test類這種情況下,爲什麼要和這裏使用typeof功能?

template< typename T, typename fT > 
T TestMyFunc(T t, fT f) { 
    return f(t); 
}; 

就行了,用函數指針的類型沒有擺弄:

std::cout << TestMyFunc(5,myfunc) << std::endl; 

模板參數是爲函數自動推導!

2

typeof是無效的C++,但如果我用這些涉及他們的兩行,那麼你的代碼工作正常或者FunFuncMyFunc定義。

typedef int (*Fun)(int); 

std::cout<<Test<int, int(*)(int)>::MyFunc(5, myfunc)<<std::endl; 
+0

我也懷疑'typeof'函數... – xtofl 2009-12-19 20:51:08

相關問題