使用C ++中的模板化方法可以交替传递函子和函数指针

时间:2012-10-17 22:59:45

标签: c++ function templates functor

我目前有一个模板化的类,使用模板化方法。适用于仿函数,但无法编译函数。

foo.h中

template <typename T>
class Foo {
   public:
   // Constructor, destructor, etc...
   template <typename Func>
   void bar(T x, Func f);
};

template <typename T>
template <typename Func>
void Foo<T>::bar(T x, Func f) { /* some code here */ }

Main.cpp的

#include "Foo.h"
template <typename T>
class Functor {
    public:
    Functor() {}
    void operator()(T x) { /* ... */ }
    private:
    /* some attributes here */
};

template <typename T>
void Function(T x) { /* ... */ } 

int main() {
   Foo<int> foo;
   Functor<int> F;
   foo.bar(2, F); // No problem
   foo.bar(2, Function); // <unresolved overloaded function type>
   return 0;
}

1 个答案:

答案 0 :(得分:3)

如果你想获得一个重载函数的函数指针,你需要告诉系统你想要的过载集中的哪个函数:

foo.bar(2, static_cast<void(*)(int)>(&Function);

在引用的案例中,该函数实际上是一个模板,即您也可以直接参考其专业化:

foo.bar(2, &Function<int>);