2014-04-07 2 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'| 

EDIT: Тогда я хотел бы передать этот указатель: ли это правильный путь?

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++ template 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 ; –

Смежные вопросы