2016-04-26 123 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>;