簡體   English   中英

了解模板和函數指針

[英]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);
}

類的靜態函數成員只是該類名稱空間中的一個常規函數:

類的靜態成員不與該類的對象關聯:它們是具有靜態存儲持續時間或在名稱空間范圍內定義的常規函數​​的獨立對象,在程序中僅一次。

cppreference.com

在您的示例中, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM