• <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>
            cyt
            發(fā)現(xiàn)自己是越來越懶了,竟然原來有大半年沒有寫blog。

            今天是中秋節(jié),先祝各位看官中秋節(jié)快樂、人月兩團(tuán)圓!!!!

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

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

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

            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;

            個(gè)人覺得比boost的簡潔一些。不過boost的bind加上的lambda實(shí)在是無敵。


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

            asio 說到網(wǎng)絡(luò)的異步響應(yīng)框架,首先想到的就是ACE的proactor。但是個(gè)人一直覺得ACE是在有愧于C++,C語言的痕跡太深了,估計(jì)是“出道”太早的緣故。boost類庫遲遲沒有thread、socket方面的lib放出。asio似乎可以填補(bǔ)了這兩個(gè)空白。asio基于boost,類庫的風(fēng)格以及提供的接口也跟boost十分相似。還是給段例子實(shí)際:
            #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;
            }

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

              to 小豬:我暫時(shí)還沒有用到保存,我也只是暫時(shí)用到讀取部分。遲點(diǎn)用到的時(shí)候我再回復(fù)你吧。
                回復(fù)  更多評(píng)論   

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


             
            日韩久久久久中文字幕人妻| 国产成人AV综合久久| 久久国产精品一区二区| 久久久久免费精品国产| 久久国产香蕉一区精品| 久久综合亚洲色一区二区三区| 精品国产乱码久久久久久呢| 亚洲成色WWW久久网站| 九九99精品久久久久久| 97久久精品无码一区二区| 久久婷婷五月综合成人D啪| 伊人久久大香线蕉av一区| 99久久国产综合精品五月天喷水| 国产精品久久久久久久人人看| 国产午夜电影久久| 久久久久香蕉视频| 久久99精品国产麻豆宅宅| 婷婷久久香蕉五月综合加勒比 | 伊人色综合九久久天天蜜桃| 久久天天躁狠狠躁夜夜96流白浆 | 久久青青草视频| 久久亚洲国产精品一区二区| 97精品国产97久久久久久免费| 精品国产一区二区三区久久蜜臀| 亚洲AV无码久久| 久久婷婷成人综合色综合| 中文字幕久久欲求不满| 久久天天日天天操综合伊人av| 久久久久久久久久久精品尤物 | 天天久久狠狠色综合| 国产69精品久久久久9999| 欧美午夜A∨大片久久 | 久久久久久国产精品无码超碰| 国产精品99久久久久久宅男| 久久WWW免费人成—看片| 久久中文字幕人妻熟av女| 国产91久久精品一区二区| 看全色黄大色大片免费久久久| 亚洲国产精品无码久久久秋霞2| 久久精品国产亚洲一区二区| 性做久久久久久久久|