真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

讓類成員函數(shù)指針成為可調(diào)用對象

    類成員函數(shù)指針實踐上是一個指針類型,不可直接通過調(diào)用運算符()作為可調(diào)用對象調(diào)用,一般調(diào)用該類成員函數(shù)指針需要指定該指針對應(yīng)的對象。

成都創(chuàng)新互聯(lián)主打移動網(wǎng)站、網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護、申請域名、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再決定采用什么樣的設(shè)計。最后,要實現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計,我們還會規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。

    一般情況下調(diào)用類成員函數(shù)指針:

// a.h
#ifndef A_H
#define A_H
#include 
using std::cout;
using std::endl;

class A{
public:
    void print();
};
#endif

// a.cpp
#include "a.h"
void A::print()
{
    cout << "A::print" << endl;
}

// main.cpp
#include "a.h"
using pClassF = void (A::*)(); // 聲明類A的成員函數(shù)指針類型

int main()
{
    pClassF pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換
    A a;
    (a.*pf)(); // .*、->*成員訪問符,因為訪問優(yōu)先級則(a.*pf)的括號必須添加
    return 0;
}

其中A::*表示是類A的成員指針,接著的()表示是無參的函數(shù)類型;

如果直接是pf()則出錯,因為pf不是可調(diào)用對象其未指定對象執(zhí)行;

使用的std::function模板類:

因為類的成員函數(shù)執(zhí)行時,會在參數(shù)列表添加參數(shù)--隱式的this實參,在function模板類調(diào)用時可以傳入對象實現(xiàn)this的功能(傳入的對象不一定是指針類型),function判斷如果是類成員函數(shù)指針,則會將通過該對象使用成員訪問運算符,實現(xiàn)類成員函數(shù)指針的調(diào)用功能(具體function如何判斷是類成員函數(shù)指針還是普通函數(shù)指針,本人現(xiàn)在不清楚,如果有理解錯誤地方望指正):

// main.cpp ,頭文件a.h與源文件a.cpp之前相同
#include 
#include "a.h"
using std::function;
using pClassF = void (A::*)(); // 聲明類A的成員函數(shù)指針類型

int main()
{
    auto pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換
    A a;
    
    // void 表示成員函數(shù)的返回值,A表示傳入的參數(shù)類型為A,因為是模板類型則要求可以準(zhǔn)確匹配,且A類型可以調(diào)用對應(yīng)的成員函數(shù),如果是const A類要調(diào)用const成員函數(shù)
    function fnt = pf;
    fnt(a);
    return 0;
}

通過fnt(a)傳入對象a,在function里通過a與成員訪問符調(diào)用成員函數(shù)。

使用std::mem_fn標(biāo)準(zhǔn)庫函數(shù)

mem_fn函數(shù)可以通過成員函數(shù)指針的類型自動推斷可調(diào)用對象類型,用戶無須指定。在可調(diào)用對象里有接收對象與對象指針的一組調(diào)用運算符重載函數(shù),可使用對象或?qū)ο笾羔樥{(diào)用該成員函數(shù),使用方式與function相同:

// main.cpp,頭文件a.h與源文件a.cpp之前相同
#include 
#include "a.h"
using std::mem_fn;
using pClassF = void (A::*)() const; // 聲明類A的成員函數(shù)指針類型

int main()
{
    auto pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換
    A a;
    auto fnt = mem_fn(pf); // mem_fn通過成員函數(shù)指針自動推導(dǎo)可調(diào)用對象類型
    fnt(a); // 使用對象調(diào)用成員函數(shù)
    fnt(&a); // 使用對象指針調(diào)用成員函數(shù)
    return 0;
}

fnt(a)與fnt(&a)的結(jié)果一致。

使用通用的函數(shù)適配器bind生成可調(diào)用對象,需要命名空間std::placeholders表示在bind傳給函數(shù)的參數(shù):

與function類似,將隱式傳入this形參轉(zhuǎn)為顯示傳入對象;與mem_fn類似,生成的可調(diào)用對象有接收對象與對象指針的一組重載調(diào)用運算符函數(shù):

// main.cpp,頭文件a.h與源文件a.cpp之前相同
#include 
#include "a.h"
using namespace std::placeholders; // 用于表示bind傳入指定函數(shù)的形參位置,即bind的_1、_2、...、_n等
using pClassF = void (A::*)() const; // 聲明類A的成員函數(shù)指針類型

int main()
{
    auto pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換
    A a;
    auto fnt = bind(pf,_1); // _1表示在bind該位置的參數(shù)傳給pf,并成為pf的第一個形參
    fnt(a); // 使用對象調(diào)用成員函數(shù)
    fnt(&a); // 使用對象指針調(diào)用成員函數(shù)
    return 0;
}

詳細(xì)說明可查閱bind函數(shù),fnt(a)與fnt(&a)的結(jié)果一致。


當(dāng)前標(biāo)題:讓類成員函數(shù)指針成為可調(diào)用對象
URL標(biāo)題:http://weahome.cn/article/ishchi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部