boost function用法詳解

2021-07-24 13:31:43 字數 2445 閱讀 4733

要開始使用 boost.function, 就要包含標頭檔案 "boost/function.hpp", 或者某個帶數字的版本,從"boost/function/function0.hpp" 到"boost/function/function10.hpp". 如果你知道你想儲存在 function 中的函式的引數數量,這樣做可以讓編譯器僅包含需要的標頭檔案。如果包含 "boost/function.hpp", 那麼就會把其它的標頭檔案也包含進去。

理解被存函式的最佳方法是把它想象為乙個普通的函式物件,該函式物件用於封裝另乙個函式(或函式物件)。這個被存的函式的最大用途是它可以被多次呼叫,而無須在建立 function 時立即使用。在宣告 functions 時,宣告中最重要的部分是函式的簽名。這部分即是告訴 function 它將儲存的函式或函式物件的簽名和返回型別。我們已經看到,有兩種方法來執行這個宣告。這裡有乙個完整的程式,程式宣告了乙個 boost::function ,它可以儲存返回 bool (或某個可以隱式轉換為 bool 的型別)並接受兩個引數的類函式實體,第乙個引數可以轉換為 int, 第二個引數可以轉換為 double.

#include

#include "boost/function.hpp"

bool some_func(int i,double d)

intoperator()(int i)

class play_command : public command_base

bool enabled() const

bool enabled() const

bool enabled() const

command(boost::functionf):f_(f) {}

void execute()

roperator()(arg arg)

roperator()(arg arg)

roperator()(arg arg)

template function1(r (t::*func)(arg),t* p) :

invoker_(new member_ptr_invoker(func,p)) {}

template function1(t t) :

invoker_(new function_object_invoker(t)) {}

roperator()(arg arg) {

return (*invoker_)(arg);

~function1() {

delete invoker_;

如你所見,這裡面最難的部分是正確地定義出推導系統以支援函式指標、類成員函式以及函式物件。無論使用何種設計來實現這類功能的庫,這都是必須的。最後,給出一些例子來測試我們這個方案。

bool some_function(const std::string&s) {

std::cout << s << " this is really neat/n";

return true;

class some_class {

public:

bool some_function(const std::string& s) {

std::cout << s << " this is also quite nice/n";

return true;

class some_function_object {

public:

bool operator()(const std::string& s) {

std::cout << s <<

" this should work, too, in a flexible solution/n";

return true;

我們的 function1 類可以接受以下所有函式。

int main() {

function1f1(&some_function);

f1(std::string("hello"));

some_class s;

function1

f2(&some_class::some_function,&s);

f2(std::string("hello"));

function1

f3(boost::bind(&some_class::some_function,&s,_1));

f3(std::string("hello"));

some_function_object fso;

function1

f4(fso);

f4(std::string("hello"));

它也可以使用象 boost.bind 和 boost.lambda 這樣的 binder 庫所返回的函式物件。我們的類與 boost.function 中的類相比要簡單多了,但是也已經足以看出建立和使用這樣乙個庫的問題以及相關解決方法。知道一點關於乙個庫是如何實現的事情,對於有效使用這個庫是非常有用的。

文章**

Boost Function的基本使用

boost.function的基本使用 boost.function庫用來提供乙個物件化的函式指標。函式指標對設計很有用。它使呼叫者可以延期呼叫,呼叫時機由呼叫者確定。而且可以改變 響應者,以應對不同的要求。c中的函式指標只能用於自由函式。在c 中除了自由函式還有函式物件和類成員函式,這些 c的函式...

stack用法,queue用法,

stack stack 模板類的定義在標頭檔案中。stack 模板類需要兩個模板引數,乙個是元素型別,乙個容器型別,但只有元素型別是必要 的,在不指定容器型別時,預設的容器型別為deque。定義stack 物件的示例 如下 stack s1 stack s2 stack 的基本操作有 入棧,如例 s...

stack用法,queue用法,

stack stack 模板類的定義在標頭檔案中。stack 模板類需要兩個模板引數,乙個是元素型別,乙個容器型別,但只有元素型別是必要 的,在不指定容器型別時,預設的容器型別為deque。定義stack 物件的示例 如下 stack s1 stack s2 stack 的基本操作有 入棧,如例 s...