我想知道为什么要将fun1()作为静态成员函数?模板中的函数指针?在下面的代码中。
#include<iostream>
using namespace std;
class A
{
int temp;
public:
A():temp(1){}
template<class T, void (*fn)(T* )>
static void create(T *ptr)
{
cout <<"create fn"<<endl;
//fun1(ptr);
}
static void fun1(A* tp)
{
cout<<"func temp"<<endl;
}
static void fun2(A& ob)
{
cout<<"fun2 start"<<endl;
A::create<A,&A::fun1>(&ob);
cout<<"fun2 end"<<endl;
}
};
int main()
{
A ob,ob1;
ob.fun2(ob1);
}
答案 0 :(得分:2)
类的静态函数成员只是类命名空间中的常规函数:
类的静态成员不与类的对象关联:它们是具有静态存储持续时间的独立对象或在命名空间作用域中定义的常规函数,在程序中只有一次。
在您的示例中,A::f1
的类型为void(A*)
,A::f2
的类型为void(A&)
。值得注意的是,静态函数不需要调用实例。
或者,非静态成员函数 do 需要调用实例。您必须使用pointers to class members。在您的示例中,您将使用&A::f1
和&A::f2
,其类型分别为(void)A::*f1(A*)
和(void)A::*f2(A&)
。如果指向成员函数的指针被视为常规函数指针,它们将如何被调用?他们需要一个指向this
指针的对象实例。
您可以使用std :: bind将指向成员函数的指针转换为重载()
运算符并且行为类似于函数(AKA是函数)的对象:
A a;
std::bind(&A::f1, &a); // &a is the value of this
但是,仿函数与函数指针的类型不同。我建议在functional
头文件中使用std::function
而不是函数指针,因为它们适用于仿函数。
(有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/pointer。)