青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

cyt
發現自己是越來越懶了,竟然原來有大半年沒有寫blog。

今天是中秋節,先祝各位看官中秋節快樂、人月兩團圓!!!!

這大半年什么都干了半桶水:javascript、HTML、servlet、JSP、php、python、COM……雖說干得不精,但也有一點點收獲……

C++論壇當然還是討論回C++。
首先推薦一本書:
《Exceptional C++ Style》Herb Sutter著
Her Sutter的多篇著作都被視為C++開發的經典教本。這本書跟《Exceptional C++》的不同在于更多地討論style。作者根據自己的經驗,對C++的編寫提出了很多準則。作者對這些準則的來龍去脈說得清清楚楚,為什么要這樣做,不做會有什么后果,在什么編譯器下面準則有什么不同的表現等等……比某人出版的C++規范,提出一堆無關痛癢不知所云的規則來的實在得多。
看完以后回顧一下自己之前的代碼,簡直汗顏,重新燃起重寫的沖動……
再說一件小事,就在看完這本書的若干天后,忽然發生一件奇事。某個程序一直編譯運行都好好的。這天換了編譯環境,程序運行不斷core dump,gdb跟了一下是說某個exception沒有catch,但是代碼里面明明寫了catch的,為什么抓不住呢。幸好看了這本書(不是賣廣告,汗),第13條……中間有某個函數的異常聲明不正確。簡單說就是函數1聲明會拋出異常A和B,但函數1里面調用了函數2,函數2會拋出異常C。于是,在調用函數1的時候盡管聲明了cacth異常C也無濟于事,C就是不能處理。(這個不是所有編譯器的標準行為)

另外收集了幾個C++ lib
QuickFunctor 看名字就知道是Functor的lib。用來做functor,signal/slot當然不在話下。有趣之處在于它實現了一些boost::bind的功能(不依賴boost,但可以和boost、loki、TR1等一起使用)。給些例子會清晰一點:

struct Car
{
    
string make;
    
string model;
    
int mpg;

    Car(
const string& make, const string& model, int mpg) : make(make), model(model), mpg(mpg) {}
};

void findCars(vector<Car>& v, const Functor<bool (Car&)>& test)
{
    vector
<Car>::iterator it;
    it 
= partition(v.begin(), v.end(), test);

    cout 
<< "found " << it - v.begin() << " result(s):\n------------------\n";
    
for (vector<Car>::iterator it1 = v.begin(); it1 != it; ++it1)
    {
        cout 
<< (*it1) << endl;
    }
    cout 
<< "**************************************\n";
}

bool hasTdi(const string& s)
{
    
return string::npos != s.find_first_of("TDI");
}

    cout 
<< "Cars that have at least 23 mpg\n";
    findCars(v, mkF(
&Car::mpg) >= 23);

    cout 
<< "Cars that have the mpg between 23 and 41\n";
    findCars(v, mkF(
&Car::mpg) >= 23 && mkF(&Car::mpg) <= 41);

    cout 
<< "Toyotas that have at least 25 mpg\n";
    findCars(v, mkF(
&Car::make) == "Toyota" && mkF(&Car::mpg) >= 25);

    vector
<Car>::iterator it;
    it 
= find_if(v.begin(), v.end(), mkF(hasTdi).comp<1>(mkF(&Car::model)));
    
//  mkF(hasTdi).o(mkF(&Car::model)) is a shortcut for the test above
    cout << "A car that has TDI: " << (*it) << endl;

個人覺得比boost的簡潔一些。不過boost的bind加上的lambda實在是無敵。


另外收藏一個lib是rapidxml 其特點就是完全是C++ header,lib本身不需要編譯,除了STL不需要其他的lib,STL風格的接口。還有一個是我最想要的,對XML內容的訪問可以通過引用方式,不需要額外分配內存。舉例說,假如有一個char * p指針,并分配了一大片內存空間,在里面保存了XML的完整內容。經過parse后,我想獲得其中一個node的內容,那我可以選擇一種方式,直接引用p所指向的內存中的一部分來獲得node的內容,而不需要重新分配一段空間來保存。
以往我一直選用CMarkup作為C++的parser,目的就是圖他簡單。現在發現rapidxml后,發現rapidxml似乎比CMarkup簡單易用,更重要的是rapidxml完全開源,不像CMarkup那樣還要分不同的license。對于簡單的訪問XML,覺得這個rapidxml足夠了。

asio 說到網絡的異步響應框架,首先想到的就是ACE的proactor。但是個人一直覺得ACE是在有愧于C++,C語言的痕跡太深了,估計是“出道”太早的緣故。boost類庫遲遲沒有thread、socket方面的lib放出。asio似乎可以填補了這兩個空白。asio基于boost,類庫的風格以及提供的接口也跟boost十分相似。還是給段例子實際:
#include <ctime>
#include 
<iostream>
#include 
<string>
#include 
<boost/bind.hpp>
#include 
<boost/shared_ptr.hpp>
#include 
<boost/enable_shared_from_this.hpp>
#include 
<asio.hpp>

using asio::ip::tcp;

std::
string make_daytime_string()
{
  
using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  
return ctime(&now);
}

class tcp_connection
  : 
public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr
<tcp_connection> pointer;

  
static pointer create(asio::io_service& io_service)
  {
    
return pointer(new tcp_connection(io_service));
  }

  tcp::socket
& socket()
  {
    
return socket_;
  }

  
void start()
  {
    message_ 
= make_daytime_string();

    asio::async_write(socket_, asio::buffer(message_),
        boost::bind(
&tcp_connection::handle_write, shared_from_this(),
          asio::placeholders::error,
          asio::placeholders::bytes_transferred));
  }

private:
  tcp_connection(asio::io_service
& io_service)
    : socket_(io_service)
  {
  }

  
void handle_write(const asio::error& /*error*/,
      size_t 
/*bytes_transferred*/)
  {
  }

  tcp::socket socket_;
  std::
string message_;
};

class tcp_server
{
public:
  tcp_server(asio::io_service
& io_service)
    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 
13))
  {
    start_accept();
  }

private:
  
void start_accept()
  {
    tcp_connection::pointer new_connection 
=
      tcp_connection::create(acceptor_.io_service());

    acceptor_.async_accept(new_connection
->socket(),
        boost::bind(
&tcp_server::handle_accept, this, new_connection,
          asio::placeholders::error));
  }

  
void handle_accept(tcp_connection::pointer new_connection,
      
const asio::error& error)
  {
    
if (!error)
    {
      new_connection
->start();
      start_accept();
    }
  }

  tcp::acceptor acceptor_;
};

int main()
{
  
try
  {
    asio::io_service io_service;
    tcp_server server(io_service);
    io_service.run();
  }
  
catch (std::exception& e)
  {
    std::cerr 
<< e.what() << std::endl;
  }

  
return 0;
}

暫時不清楚asio的性能如何。ACE經過千錘百煉,無數的應用實踐,其地位不是這么容易動搖。但asio的封裝方式是否值得ACE效仿呢。
posted on 2007-09-25 12:16 cyt 閱讀(2686) 評論(4)  編輯 收藏 引用
Comments
  • # re: 中秋節快樂
    夢在天涯
    Posted @ 2007-09-25 15:13
    LZ是用c++做網絡的嗎,以后多向你學習~!  回復  更多評論   
  • # re: 中秋節快樂
    zcpro
    Posted @ 2007-09-26 17:38
    asio已經被并到boost里了,還在修改,沒有完成  回復  更多評論   
  • # re: 中秋節快樂
    小豬
    Posted @ 2007-09-29 14:59
    弱弱的問一句: rapidxml 修改了節點之后,怎么保存數據?
      回復  更多評論   
  • # re: 中秋節快樂
    cyt
    Posted @ 2007-10-27 09:49
    to zcpro:我也看到了asio說加入boost,不過boost的標準包里面還沒有看到它的蹤影。當年spirit也有這樣的現象。估計加入boost大家庭“手續”還是挺麻煩的。

    to 小豬:我暫時還沒有用到保存,我也只是暫時用到讀取部分。遲點用到的時候我再回復你吧。
      回復  更多評論   

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            **网站欧美大片在线观看| 欧美国产日韩一区二区三区| 日韩一区二区精品葵司在线| 久久天天躁狠狠躁夜夜av| 亚洲男女自偷自拍| 亚洲无线一线二线三线区别av| 亚洲欧洲在线看| 在线观看日韩av| 亚洲激情欧美| 亚洲激情欧美激情| 亚洲免费av电影| 日韩午夜一区| 亚洲摸下面视频| 欧美在线高清| 美女脱光内衣内裤视频久久影院| 久久www免费人成看片高清| 久久精品日产第一区二区| 久久精品伊人| 免播放器亚洲| 亚洲毛片在线看| 亚洲天堂av电影| 亚欧成人在线| 久久午夜视频| 欧美日韩在线观看视频| 国产精品亚洲精品| 黄色一区二区在线| 亚洲毛片av| 久久不射网站| 欧美黄色影院| 在线一区视频| 久久久久一区二区三区| 欧美日韩精品一区| 国产一区观看| 一本在线高清不卡dvd| 久久国产天堂福利天堂| 欧美福利专区| 亚洲一区二三| 欧美人与禽猛交乱配视频| 国产精品美女久久久久久2018| 狠狠干成人综合网| 亚洲综合丁香| 亚洲日本视频| 欧美一区二区福利在线| 欧美精品在线免费| 狠狠色狠狠色综合| 亚洲字幕在线观看| 欧美激情精品久久久| 性色av一区二区三区| 欧美日韩成人在线| 亚洲人成人一区二区在线观看| 亚洲欧美日韩另类| 一本久久a久久精品亚洲| 欧美成人四级电影| 在线精品视频一区二区| 久久精品综合一区| 亚洲欧美在线一区| 国产女人18毛片水18精品| 亚洲午夜精品视频| 亚洲黄色免费| 欧美日本乱大交xxxxx| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美成人午夜剧场免费观看| 狠狠干综合网| 久久五月激情| 亚洲一区二区三区精品动漫| 欧美日韩国产美| 日韩视频在线观看一区二区| 亚洲成人在线视频播放 | 亚洲高清视频一区| 夜夜爽夜夜爽精品视频| 亚洲综合色视频| 久久九九全国免费精品观看| 欧美与欧洲交xxxx免费观看 | 裸体素人女欧美日韩| 欧美日本亚洲韩国国产| 国产亚洲精品久| 久久riav二区三区| 欧美一区三区二区在线观看| 国产乱肥老妇国产一区二| 午夜在线播放视频欧美| 亚洲欧美日韩精品久久久久| 国产精品一区2区| 久久成人精品无人区| 久久爱www久久做| 亚洲国产欧美精品| 99av国产精品欲麻豆| 国产精品久久九九| 久久久高清一区二区三区| 老司机精品视频一区二区三区| 亚洲国产成人91精品| 99热免费精品在线观看| 国产欧美日韩在线 | 免费欧美视频| 亚洲在线第一页| 久久久人成影片一区二区三区| 亚洲精品视频中文字幕| 亚洲女优在线| 亚洲欧洲精品一区二区三区不卡| 日韩午夜激情电影| 精品成人久久| 亚洲精品在线视频观看| 含羞草久久爱69一区| 亚洲激精日韩激精欧美精品| 国产精品美女久久久久av超清 | 篠田优中文在线播放第一区| 亚洲国产日韩一区二区| 午夜宅男久久久| 一区二区三区久久网| 久久亚洲影院| 久久国产精品久久久久久久久久 | 久久久免费av| 国产精品成人在线| 欧美激情一二三区| 国内自拍一区| 亚洲自拍偷拍麻豆| 99精品国产热久久91蜜凸| 久久久久久久一区| 久久疯狂做爰流白浆xx| 麻豆精品视频| 欧美资源在线观看| 国产精品99一区二区| 亚洲欧洲综合另类| 亚洲高清影视| 久热精品视频| 欧美国产精品日韩| 一区在线视频| 看片网站欧美日韩| 男同欧美伦乱| 亚洲国产欧美一区二区三区同亚洲| 欧美一级理论性理论a| 国产精品美女在线观看| 亚洲福利国产| 亚洲另类视频| 欧美色中文字幕| 在线亚洲精品福利网址导航| 亚洲一区二区欧美日韩| 欧美日韩免费一区二区三区视频| 亚洲无人区一区| 免费欧美高清视频| 欧美一二三视频| 亚洲夫妻自拍| 国产精品国产三级欧美二区| 久久综合色8888| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久精品国产免费| 中文精品视频| 国产婷婷精品| 乱中年女人伦av一区二区| 在线一区二区三区做爰视频网站| 久久亚洲精选| 中国av一区| 国内精品久久久久久久97牛牛| 久久综合九色| 欧美亚洲网站| 亚洲视频欧美视频| 免费欧美日韩国产三级电影| 午夜精品久久久久久久久| 亚洲人成在线免费观看| 国产一区日韩欧美| 欧美xxx在线观看| 久久成年人视频| 一区二区不卡在线视频 午夜欧美不卡在 | 国产情人节一区| 欧美日韩国产精品自在自线| 久热精品视频在线观看一区| 亚洲网友自拍| 亚洲手机在线| 亚洲美女黄网| 亚洲精品极品| 亚洲国产91| 欧美成人在线网站| 欧美专区亚洲专区| 最新国产成人av网站网址麻豆 | 国产真实久久| 国产精品久久久久久久久久免费 | 一区二区电影免费在线观看| 亚洲国产合集| 免费黄网站欧美| 久久亚洲综合色| 在线国产欧美| 欧美成人精品一区二区三区| 亚洲黄色免费| 一本久久a久久免费精品不卡| 欧美顶级艳妇交换群宴| 日韩亚洲视频在线| 亚洲欧美国产毛片在线| 国产精品一卡二| 久久精品亚洲精品| 欧美成人精品高清在线播放| 亚洲国产成人精品女人久久久| 欧美高清在线一区| 亚洲免费播放| 先锋资源久久| 影音先锋欧美精品| 久热re这里精品视频在线6| 亚洲激情图片小说视频| 亚洲一区二区精品| 国产小视频国产精品| 久久久99国产精品免费| 免费久久99精品国产自|