锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
2 //澹版槑闇瑕佺殑閫夐」
3 options_description desc("Allowed options");
4 desc.add_options()
5 ("help,h", "produce help message")
6 ("person,p", value<string>()->default_value("world"), "who");
鐪嬬4鍒?琛岋紝鏄笉鏄劅瑙夊緢鎬紵榪欑鏂瑰紡浣撶幇浜嗗嚱鏁板紡緙栫▼涓渶澶х殑鐗圭偣錛氬嚱鏁版槸涓綾誨鹼紝寮曠敤璧勬枡鏉ヨ,鎵璋?#8220;鍑芥暟鏄竴綾誨鹼紙First Class Value錛?#8221;鎸囩殑鏄嚱鏁板拰鍊兼槸鍚岀瓑鐨勬蹇碉紝涓涓嚱鏁板彲浠ヤ綔涓哄彟澶栦竴涓嚱鏁扮殑鍙傛暟錛屼篃鍙互浣滀負鍊間嬌鐢ㄣ傚鏋滃嚱鏁板彲浠ヤ綔涓轟竴綾誨間嬌鐢紝閭d箞鎴戜滑灝卞彲浠ュ啓鍑轟竴浜涘嚱鏁幫紝浣垮緱榪欎簺鍑芥暟鎺ュ彈鍏跺畠鍑芥暟浣滀負鍙傛暟騫惰繑鍥炲彟澶栦竴涓嚱鏁般傛瘮濡傚畾涔変簡f鍜実涓や釜鍑芥暟錛岀敤compose(f,g)鐨勯鏍煎氨鍙互鐢熸垚鍙﹀涓涓嚱鏁幫紝浣垮緱榪欎釜鍑芥暟鎵цf(g(x))鐨勬搷浣滐紝鍒欏彲縐癱ompose涓洪珮闃跺嚱鏁幫紙Higher-order Function錛夈?br>
program_options閲岀殑榪欑鏂瑰紡鏄庝箞瀹炵幇鐨勫憿錛熼氳繃鍒嗘瀽boost鐨勬簮浠g爜錛屾垜浠嚜宸辨潵鍐欎釜綾諱技鐨勫疄鐜扮湅鐪嬶細
test.h
2
3 #include <iostream>
4 using namespace std;
5
6 class Test;
7
8 class Test_easy_init
9 {
10 public:
11 Test_easy_init(Test* owner):m_owner(owner){}
12
13 Test_easy_init & operator () (const char* name);
14 Test_easy_init & operator () (const char* name,int id);
15 private:
16 Test* m_owner;
17 };
18
19
20 class Test
21 {
22 public:
23 void add(const char* name);
24 void add(const char* name,int id);
25
26 Test_easy_init add_some();
27
28 };
test.cpp
2
3 Test_easy_init & Test_easy_init::operator () (const char* name,int id)
4 {
5
6 m_owner->add(name,id);
7 return *this;
8 }
9
10
11 Test_easy_init & Test_easy_init::operator () (const char* name)
12 {
13
14 m_owner->add(name);
15 return *this;
16 }
17
18 Test_easy_init Test::add_some()
19 {
20 return Test_easy_init(this);
21 }
22
23
24 void Test::add(const char* name)
25 {
26 cout<<"add:"<<name<<endl;
27 }
28
29 void Test::add(const char* name,int id)
30 {
31 cout<<"add:"<<name<<"-"<<id<<endl;
32 }
浣跨敤鏂瑰紡錛?br>
2
3 t1.add_some()
4 ("hello",1)
5 ("no id")
6 ("hello2",2);
鏄笉鏄緢鏈夋剰鎬濄俛dd_some()鏂規硶榪斿洖涓涓猅est_easy_init綾葷殑瀵硅薄錛孴est_easy_init綾婚噸杞戒簡鎿嶄綔絎?)錛屾搷浣滅()鏂規硶榪斿洖Test_easy_init綾誨璞¤嚜韜殑寮曠敤銆傘?
]]>
]]>
鍋氳繃涓涓畝鍗曠殑嫻嬭瘯錛?0涓囨鍐呭瓨姹犺皟鐢ㄧ殑鏁堢巼澶ф姣旂洿鎺ュ垎閰嶉噴鏀懼唴瀛樻彁楂樹簡30-50%銆備絾鏄墠鎻愭槸鍐呭瓨姹犱笉鑳藉姞閿侊紙pthread_mutex錛夛紝鍔犻攣鐨勫唴瀛樻睜鏁堢巼鍜岀洿鎺ュ垎閰嶅唴瀛樼殑鏁堢巼宸笉澶氾紝鏈夋椂鍊欒繕瑕佸鐐圭偣銆傦紙嫻嬭瘯鐨勭幆澧冩槸姣忔2K錛?涓弻鏍窩PU錛孎REEBSD7錛?br>
浠g爜瀹炵幇錛?br>
struct memblock

{
int used;
void* data;
struct memblock* next;
struct memblock* createnext;
};
{
int size;//memblock澶у皬
int unused;//絀洪棽鐨刴emblock澶у皬
int datasize;//姣忔鍒嗛厤鐨勬暟鎹ぇ灝?灝辨槸memblock.data)
struct memblock* free_linkhead;//絀洪棽memblock閾捐〃澶?/span>
struct memblock* create_linkhead;//鎵鏈夊垱寤虹殑memblock閾捐〃澶達紝鍐呭瓨姹犻噴鏀劇殑鏃跺欎嬌鐢紝闃叉鍐呭瓨姹犻噴鏀劇殑浼間箮榪樻湁memblock鏈綊榪樼殑鎯呭喌
};
typedef void (*free_callback)(void*);//閲婃斁鍥炶皟鍑芥暟錛岄噴鏀緈embloc.data鐢紝鍙互綆鍗曠殑鐩存帴鐢╢ree鍑芥暟
void mempool_init(int initialSize,int datasize);//鍒濆鍖杕empool
void mempool_dealloc(struct mempool* pool,free_callback callback);//閲婃斁mempool
void* mempool_get(struct mempool* pool);//鑾峰彇涓涓猰emblock
void mempool_release(struct mempool* pool,struct memblock* block);//褰掕繕涓涓猰emblock
/*********************************
* mempool
* ******************************/
//malloc涓涓猰emblock
static struct memblock* mempool_allocblock( struct mempool* pool );
//------------------implement--------
void*
mempool_init( int initialSize, int datasize )
{
struct mempool* pool = malloc( sizeof( struct mempool ) );
pool->unused = 0;
pool->datasize = datasize;
pool->free_linkhead = NULL;
//棰勫厛鍒濆鍖杋nitialSize涓唴瀛樺潡
pool->create_linkhead = NULL;
int i;
for ( i = 0; i < initialSize; i++ ) {
struct memblock* block = mempool_allocblock( pool );
mempool_release( pool, block );
}
return ( pool );
}
void
mempool_dealloc( struct mempool* pool, free_callback callback )
{
struct memblock* block = NULL;
//灝嗘墍鏈夊垱寤虹殑memblock閲婃斁浜?/span>
while ( pool->create_linkhead != NULL ) {
block = pool->create_linkhead;
pool->create_linkhead = pool->create_linkhead->createnext;
//鎵цfree鍥炶皟銆?/span>
if ( callback ) {
( *callback )( block->data );
}
free( block );
}
free( pool );
L_DEBUG( "%s:size(%d),unused(%d)", __func__, pool->size, pool->unused );
}
static struct memblock*
mempool_allocblock( struct mempool* pool )
{
struct memblock* block = malloc( sizeof( struct memblock ) );
block->data = malloc( sizeof( pool->datasize ) );
block->next = NULL;
block->used = 1;//琛ㄧず宸蹭嬌鐢?br>
//鍔犲叆鎵鏈夊垱寤虹殑memblock鐨勯摼琛ㄥご
block->createnext = pool->create_linkhead;
pool->create_linkhead = block;
pool->size++;
return ( block );
}
void
mempool_release( struct mempool* pool, struct memblock* block )
{
if ( block == NULL ) {
L_WARN( "%s:release a NULL!", __func__ );
return;
}
if ( block->used != 1 ) {
L_WARN( "%s:used!=1", __func__ );
return;
}
//灝嗗綊榪樼殑鍐呭瓨鍧楁斁鍒扮┖闂查摼琛ㄥご銆?/span>
block->used = 0;//琛ㄧず絀洪棽
block->next = pool->free_linkhead;
pool->free_linkhead = block;
pool->unused++;//絀洪棽鏁?1
}
void*
mempool_get( struct mempool* pool )
{
struct memblock* block = NULL;
if ( pool->free_linkhead ) {
//浠庣┖闂查摼琛ㄥご鍙栧嚭涓涓唴瀛樺潡
block = pool->free_linkhead;
pool->free_linkhead = pool->free_linkhead->next;
block->next = NULL;
block->used = 1;//琛ㄧず宸蹭嬌鐢?/span>
pool->unused--;//絀洪棽鍐呭瓨鍧楁暟-1
}
else {
//娌℃湁絀洪棽鐨勫唴瀛樺潡錛屽垱寤轟竴涓?/span>
block = mempool_allocblock( pool );
}
return ( block );
}
]]>