[英]Understanding about templates and function pointer
我想知道為什么必須將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);
}
類的靜態函數成員只是該類名稱空間中的一個常規函數:
類的靜態成員不與該類的對象關聯:它們是具有靜態存儲持續時間或在名稱空間范圍內定義的常規函數的獨立對象,在程序中僅一次。
在您的示例中, A::f1
的類型將為void(A*)
,而A::f2
的類型將為void(A&)
。 值得注意的是,靜態函數不需要調用實例。
或者,非靜態成員函數確實需要調用實例。 您將必須使用指向類成員的指針 。 在您的示例中,將使用&A::f1
和&A::f2
,它們的類型分別為(void)A::*f1(A*)
和(void)A::*f2(A&)
。 如果將指向成員函數的指針視為常規函數指針,將如何調用它們? 他們將需要一個對象實例,以使this
指針指向。
您可以使用std :: bind將成員函數的指針轉換為重載()
運算符並表現為函數(又稱函子)的對象:
A a;
std::bind(&A::f1, &a); // &a is the value of this
但是,函子與函數指針的類型不同。 我建議在functional
頭文件中使用std::function
而不是函數指針,因為它們可以容納函子。
(有關更多信息,請參見http://en.cppreference.com/w/cpp/language/pointer 。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.