函数指针模板化函数

时间:2016-04-26 21:17:57

标签: c++ templates template-meta-programming

我有两个模板化的功能签名。这里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);
}

我尝试这样的东西,但是我得到了编译错误:

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

3 个答案:

答案 0 :(得分:2)

您不能拥有指向函数模板的指针,但您可以拥有指向函数模板的特定实例的指针。

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

答案 1 :(得分: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>;

答案 2 :(得分:0)

除非你需要pointer,否则你可以使用:

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