2014-04-07 42 views
-1

我想指向模板函數,它有2個參數,類型爲T指向不是任何類的成員的模板函數

template <typename T> 
typedef bool(* f)(T, T); 

template <typename T> 
bool mniejsze (T pierwszy , T drugi){ 
    if(pierwszy < drugi) 
     return true; 
    return false; 
} 
template <typename T> 
bool wieksze (T pierwszy, T drugi){ 
    if(pierwszy > drugi) 
     return true; 
    return false; 
} 

,但我得到:

error: template declaration of 'typedef'| 

編輯:那麼我想傳遞指針: 是正確的方式?

template <typename T> 
T minmax(T a[], int n,bool &f){ 
    return f(a[0],a[1]); 

} 
+0

C++ 11支持?你知道你會得到一個'template'類型,並得到指針,你將不得不提供'T'? – Yakk

+0

可能重複的[C++模板typedef](http://stackoverflow.com/questions/2795023/c-template-typedef) – MatthiasB

+0

@MatthiasB它不是重複我問關於指針沒有模板功能。 – Yoda

回答

1

在C++ 11,你可以這樣做:

template<class T> 
using f = bool(*)(T, T); 

及用途:

f<int> fp = wieksze; 
2

在C++ 11可以使用別名:

template<typename T> 
using f = bool(*)(T, T); 

用法:

f<int> f1 = wieksze; 
f1(3, 4); 

http://ideone.com/KyUjwP

在C++ 03有一個workoround:

template<typename T> 
struct f { 
    typedef bool(*type)(T, T); 
}; 

用法:

f<int>::type f1 = mniejsze<int>; 
f<int>::type f2 = mniejsze<int>; 
f1(3, 4); 

template<typename T> 
T minmax(T a[], int n, typename f<T>::type fp){ 
    if (fp(a[0], a[1])) return 1; 
    return -1; 
} 

int main() { 
    // your code goes here 
    f<int>::type f1 = wieksze<int>; 
    bool b = f1(3, 4); 
    int a[] = { 3, 4}; 
    std::cout << minmax<int>(a, 0, f1); 
    return 0; 
} 

http://ideone.com/Dh2eEN

+0

非常感謝你,但如何將它通過函數: 這不起作用非常好 'T minmax(T a [],int n,&f){ }' – Yoda

+0

@Yoda我提供了一個示例C++ 03 – 4pie0

1

怎麼樣以下?

template <typename T> 
    struct FNPTR { 
    typedef bool (*f)(T, T); 
}; 

把一個結構的虛擬包裝,並使用FNPTR :: f後? 例如,

FNPTR::f = mniejsze<char>; 

這應該工作!

+0

你的意思是'FNPTR :: ff = mniejsze ;'? – Jarod42

+0

@ Jarod42,是的,只是作爲使用char類型的模板實例化的一個例子,我的意思是FNPTR :: f f = mniejsze ; –

相關問題