zoukankan      html  css  js  c++  java
  • 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象

     
     

    总结1:

    今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑。
    scanf函数在读入非空白符分割的多个字符串的解决方法是这个:
    /* 以 | 分割 */

    scanf("login|%d|%[^|]|%[^|]", &type, name, password);
    



    总结2:
    C++排错是个苦活,又无法避免减轻,不要stl也不能不用<string>吧。倒不是python宠坏了程序员,而是C++本身语法复杂,层次繁杂,过于抽象。
    不过在某些方面用好c++确实比c要好用。

    总结3:

    文档太少,看着源码用cgicc。
    登录后需要重定向,先看看cgicc是否已经做好这功能。
    第一步:

    grep 301 . -inr
    


    第二步:
    发现HTTPRedirect.cpp,定位到

    void 
    cgicc::HTTPRedirectHeader::render(std::ostream& out) 	const
    {
      if(fStatus == 301)
        out << "Status: 301 Moved Permanently" << std::endl;
      else if(fStatus == 302)
        out << "Status: 302 Found" << std::endl;
      out << "Location: " << getData() << std::endl;
      
      if(false == getCookies().empty()) {
        std::vector<HTTPCookie>::const_iterator iter; 
        
        for(iter = getCookies().begin(); iter != getCookies().end(); ++iter)
          out << *iter << std::endl;
      }
      
      out << std::endl;
    }
    


    已经有实现。
    第三步:
    如何使用?发现render源码中有很多,直接调用吗?
    感谢我课堂上学的《accelerate c++》,想起里面提到的关键字friend用于在类外实现类的输出功能。
    于是猜到render()其实是重载符<<的实现者的。
    第四步:
    联想见过的

    cout << HTTPHTMLHeader() << endl;
    


    悟到使用方式:

    cout << HTTPRedirectHeader(url) << endl; 
    


    测试成功,证实了我的想法,对cgicc的某些部分认识加深。

    感悟:
    第一次知道看源码去用某个库是在python世界里的,然而第一次实现这想法确实在C++里!


    总结4:

    cgicc不大不小,看源码很有益,适合c++已入门者。
    只要看得懂,很多C++的东西瞬间找回来。
    我主要看来demo/下的示例,header,cookie部分的源码。



    总结5:
    stl库之模板,谓词,函数对象

    cgicc::const_form_iterator
    cgicc::Cgicc::getElement(const std::string& name)         const
    {
      return std::find_if(fFormData.begin(), fFormData.end(),FE_nameCompare(name));
    }
    


    跟踪FE_nameCompare()定义:

    class FE_nameCompare : public std::unary_function<FormEntry, bool>
      {
      public:
        
        inline explicit FE_nameCompare(const std::string& name)
          : fName(name) {}
        
        inline bool operator() (const FormEntry& entry)     const
        { return stringsAreEqual(fName, entry.getName()); }
        
      private:
        std::string fName;
      };
    


    是函数对象,用到了unary_function

    template<typename _Arg, typename _Result>
        struct unary_function
        {
          /// @c argument_type is the type of the argument
          typedef _Arg     argument_type;   
    
          /// @c result_type is the return type
          typedef _Result     result_type;  
        };
    


    来自stl的,目的就是类型改名,以便它的子类
    equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>
    使用同样类型名,因为定义stl时,Type类型名没传进去。

    同时也在复习谓词,谓词在stl大量使用,比较简单,常见用函数或函数对象解决,函数对象时牵涉到上面内容。
    感悟:
    C++内容连贯一体,不容易啊。

     
  • 相关阅读:
    本地搭建Nginx服务器启动web项目
    BZOJ 1815: [Shoi2006]color 有色图(Polya定理)
    即将退役选手最后的挣扎
    类欧几里得算法
    UOJ#449. 【集训队作业2018】喂鸽子(期望dp)
    Luogu P3600 随机数生成器(期望+dp)
    毒题选讲选做
    UOJ#310.【UNR #2】黎明前的巧克力(FWT)
    DZY Loves Math 系列详细题解
    项目中经常遇到的跨域请求的几种方法
  • 原文地址:https://www.cnblogs.com/weishun/p/tencent-shixi-2014-08-15-stl-cgii.html
Copyright © 2011-2022 走看看