2

In C++ 2003 kann typedef nur für einen vollständigen Typen verwendet werden. Daher wird erlaubt es nicht Zeiger auf eine Funktion und die generischen T als eine Art zu erstellen:C++, Zeiger auf eine Funktion als neuer Typ

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

Gibt es eine Möglichkeit, wie dieses Problem in C++ 2003 oder C++ 0x zu entziehen eine Syntax

using (*f_function)(T, T, T); // something like that 

ich möchte den Zeiger auf eine Funktion fff als einen Teilnehmer im Konstruktor

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;} 

initialisieren und seinen Wert verwenden. Anschließend:

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

Ist diese Konstruktion sicher? Gibt es einen anderen Weg, um dieses Problem zu lösen? Danke für Ihre Hilfe.

+1

Ich bin mir ziemlich sicher unvollständig 03 C++ erlaubt typedefs Typen: 'struct X; typedef X Y; ' –

Antwort

5

Sie alias Vorlage verwenden können (C++ 11) Erklärung:

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

Beispiel:

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

danke für die schnelle Lösung. – justik