2

在C++ 2003中,typedef只能用於完整類型。因此,它不是允許創建指向函數的指針和通用T作爲一個類型:C++,作爲新類型的函數指針

template <typename T> 
typedef T(*f_function)(T, T, T); 

有什麼辦法如何使用語法

逃避在C++ 2003或C++ 0x中這個問題
using (*f_function)(T, T, T); // something like that 

我想使用指針的函數FFF作爲一類構件

template <typename T> 
class A 
{ 
public: 
    f_function fff; 

    A() {fff = NULL;} 
    A(f_function pf){fff = &pf;} 
}; 

template <typename T> 
T f1(T x, T y, T z) { return x + y + z;} 

template <typename T> 
T f2(T x, T y, T z) { return x - y - z;} 

並在構造初始化它的值。隨後:

int main() 
{ 
A <double> a(f1); 
double res = a.getX(1.1, 2.2, 3.3); 
} 

這種結構是否安全?有沒有其他方法可以解決這個問題?謝謝你的幫助。

+1

我敢肯定C++ 03允許類型定義不完整類型:'struct X; typedef X Y;' –

回答

5

您可以使用別名模板(C++ 11)聲明:

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

例如:

http://coliru.stacked-crooked.com/a/5c7d77c2c58aa187

#include <iostream> 
#include <string> 
#include <array> 

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

template <typename T> 
class A 
{ 
public: 
    f_function<T> fff; 

    A() {fff = NULL;} 
    A(f_function<T> pf){fff = pf;} 
}; 

template <typename T> 
T f1(T x, T y, T z) { return x + y + z;} 

template <typename T> 
T f2(T x, T y, T z) { return x - y - z;} 

int main() 
{ 
A <double> a(f1); 
double res = a.fff(1.1, 2.2, 3.3); 
std::cout << res; 
} 
+0

感謝您的快速解決方案。 – justik