2016-04-26 15 views
1

Ich habe zwei Template-Funktionssignaturen. Hier kann T entweder int oder doppelt sein.Funktionszeiger auf Template-Funktion

template <typename T> 
Box<T> f2p(Box<T> const& box, Point<T> const& pt, Orientation o) 
{ 
... 
} 

template <typename T> 
Box<T> p2f(Box<T> const& box, Point<T> const& pt, Orientation o) 
{ 
... 
} 

Jetzt je nach Richtung, ich möchte entweder f2p oder p2f anrufen. Ich möchte einen Funktionszeiger erstellen, der auf f2p oder p2f verweist. Wie erstelle ich einen Funktionszeiger auf eine Vorlagenfunktion? Ich möchte folgende Wirkung erzielen:

typename <template T> 
Box<T> do_transformation(Box<T> const& box, ..., int dir = 0) 
{ 
    function pointer p = dir ? pointer to f2p : pointer to p2f 

    return p<T>(box); 
} 

Ich versuche, so etwas wie dieses, aber ich bekomme Fehler kompilieren:

Box<T> (*p)(Box<T>, Point<T>, Orientation) = dir ? fc2p<T> : p2fc<T> 

Antwort

2

Ich versuche, so etwas wie dieses, aber ich bekomme Fehler kompilieren:

Box<T> (*p)(Box<T>, Point<T>, Orientation) = dir ? f2p<T> : p2f<T> 

Werfen Sie einen sorgfältigen Blick auf die Argumente Ihre Funktionen übernehmen:

template <typename T> 
Box<T> f2p(Box<T> const& box, Point<T> const& pt, Orientation o) 
       ^^^^^^^^    ^^^^^^^^ 

Alle Argumente müssen übereinstimmen genau. In diesem Fall:

Box<T> (*p)(Box<T> const&, Point<T> const&, Orientation) = dir ? f2p<T> : p2f<T>; 

Oder einfach:

auto p = dir ? f2p<T> : p2f<T>; 
+0

Kann nicht glauben, dass es nicht einmal zu mir trat Auto zu benutzen. –

0

Es sei denn, Sie pointer für etwas anderes benötigen, können Sie verwenden:

typename <template T> 
Box<T> do_transformation(Box<T> const& box, ..., int dir = 0) 
{ 
    return (dir ? f2p(box, ...) : p2f(box, ...)); 
} 
2

Sie können keinen Zeiger auf eine Funktionsvorlage haben, aber Sie können einen Zeiger auf eine bestimmte Instanziierung einer Funktionsvorlage haben.

Box<T>(*p)(Box<T> const&, Point<T> const&, Orientation); 
p = dir ? &f2p<T> : &p2f<T>;