當std bind遇到非靜態類成員函式

2021-10-02 17:59:45 字數 1240 閱讀 8245

之前看專案**在實現表驅動方法時,經常會遇到這樣的**:

// enum ;

// std::map> foo::m;

// void foo::func0(){}

// void foo::func1(){}

// void foo::func2(){}

void foo::

init()

時間長了以後,我一度認為std::bind的第乙個引數是乙個非靜態類成員函式時,第二個引數只能是相應類物件的指標,因為一直以來都有非靜態類成員函式的第乙個引數是隱含的this指標的說法。直到遇到下面的**:

asio::

async_write

(socket_, asio::

buffer

(message_)

, boost::

bind

(&tcp_connection::handle_write,

shared_from_this()

, asio::placeholders::error,

asio::placeholders::bytes_transferred)

);

第二個引數還能是std::shared_ptr???

開啟後才發現,第二個引數可接受的型別遠比我想象的多,第二個函式不但能接受物件指標,還可以接受物件引用,甚至是另乙個std::bind返回的可呼叫物件,下面是**:

#include

#include

class

foovoid

print()

static foo create

(int key)

private

:int m_key;};

template

<

typename t>

class

t &operator*(

)private

: t *m_p;};

intmain()

我總結出了6類情況,具體類別可見**中的注釋。std::shared_ptr對應的是最後一種情況。

感覺好麻煩,還是用lambda表示式吧。

靜態類 和 非靜態類的區別

1 不能在靜態類中宣告例項成員 變數和方法 2 非靜態類中可以呼叫靜態類中的成員和方法 3 呼叫靜態類中的成員或方法時不需要例項化 4 非靜態類中可以宣告靜態成員或靜態方法 5 靜態方法的使用效率比非靜態方法的使用效率高 6 靜態方法與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體,不自...

類中的靜態 非靜態方法

c 的類中可以包含兩種方法 靜態方法和非靜態方法。使用了static 修飾符的方法為靜態方法,反之萴是非靜態方法。靜態方琺是 種 特殊的成園方琺,它不屬紆類的某乙個具體的實唎,而是屬於類本裑。葰以對靜態方法不需要首先建立乙個類哋例項,而是採用類名.靜態方法的格式 1.static方法是類中的乙個成園...

類中的靜態 非靜態方法

c 的類中可以包含兩種方法 靜態方法和非靜態方法。使用了static 修飾符的方法為靜態方法,反之萴是非靜態方法。靜態方琺是 種 特殊的成園方琺,它不屬紆類的某乙個具體的實唎,而是屬於類本裑。葰以對靜態方法不需要首先建立乙個類哋例項,而是採用類名.靜態方法的格式 1.static方法是類中的乙個成園...