2016-04-26 120 views
1

我有兩個模板函數簽名。這裏T可以是int或者double。模板函數指針

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) 
{ 
... 
} 

現在取決於方向,我想調用f2p或p2f。我想創建一個指向f2p或p2f的函數指針。如何創建指向模板化函數的函數指針?我想達到以下效果:

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

我嘗試這樣的事情,但我得到的編譯錯誤:除非你需要pointer別的東西

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

回答

2

我嘗試這樣的事情,但我得到的編譯錯誤:

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

快來看看你的函數的參數仔細一看:

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

所有參數必須與完全匹配。在這種情況下:

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

或者,乾脆:

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

不能相信它甚至沒有想到要使用自動。 –

0

,你可以使用:

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

您不能有指向函數模板的指針,但可以有指向函數模板的特定實例的指針。

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