??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产成人精品女人久久久 ,国内精品久久久久久久涩爱 ,久久精品国产亚洲Aⅴ蜜臀色欲http://www.shnenglu.com/hdqqq/category/909.htmlzh-cnFri, 03 Jul 2015 09:20:16 GMTFri, 03 Jul 2015 09:20:16 GMT60模板实现的红黑树(wi)http://www.shnenglu.com/hdqqq/archive/2009/11/20/101450.htmlhdqqqhdqqqFri, 20 Nov 2009 01:53:00 GMThttp://www.shnenglu.com/hdqqq/archive/2009/11/20/101450.htmlhttp://www.shnenglu.com/hdqqq/comments/101450.htmlhttp://www.shnenglu.com/hdqqq/archive/2009/11/20/101450.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/101450.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/101450.html  试代码如下:
#include <iostream>
#include 
"rb_tree.h"

void test()
{
    rb_tree
<intint> ltree;
    std::cout 
<< "the tree is empty: " << (ltree.empty() ? "true" : "false"<< std::endl;

    
for(int i = 0; i < 15; i++) {
        ltree.insert(i, i);
    }
    ltree.show_tree();
}

int main(int argc, char* argv[])
{
    test();
    
return 0;
}
  U黑?wi)的代码位?
  http://www.shnenglu.com/Files/hdqqq/rb_tree.zip


hdqqq 2009-11-20 09:53 发表评论
]]>
一个自ȝlist controlhttp://www.shnenglu.com/hdqqq/archive/2008/07/14/56084.htmlhdqqqhdqqqMon, 14 Jul 2008 04:05:00 GMThttp://www.shnenglu.com/hdqqq/archive/2008/07/14/56084.htmlhttp://www.shnenglu.com/hdqqq/comments/56084.htmlhttp://www.shnenglu.com/hdqqq/archive/2008/07/14/56084.html#Feedback4http://www.shnenglu.com/hdqqq/comments/commentRss/56084.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/56084.html阅读全文

hdqqq 2008-07-14 12:05 发表评论
]]>
在IE中增加文字内Ҏ(gu)集功?/title><link>http://www.shnenglu.com/hdqqq/archive/2007/12/21/39180.html</link><dc:creator>hdqqq</dc:creator><author>hdqqq</author><pubDate>Fri, 21 Dec 2007 01:18:00 GMT</pubDate><guid>http://www.shnenglu.com/hdqqq/archive/2007/12/21/39180.html</guid><wfw:comment>http://www.shnenglu.com/hdqqq/comments/39180.html</wfw:comment><comments>http://www.shnenglu.com/hdqqq/archive/2007/12/21/39180.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/hdqqq/comments/commentRss/39180.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hdqqq/services/trackbacks/39180.html</trackback:ping><description><![CDATA[<p>q几天在|上下电(sh)子书,准备攑ֈ手机上看,在网上ctrl+c ,然后ctrl+v到记事本,太麻?ch)?jin),<br>于是写了(jin)个ie的右键菜单处?直接在ie里面存到文本文g里面<br><br>把下面的javascript存成一个htm文g<br><br></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><</span><span style="COLOR: #000000">script language</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">javascript</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>   </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">  fso,ForAppending,ts;   <br>   fso</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  ActiveXObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Scripting.FileSystemObject</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);  <br>   ForAppending  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">;  <br>   ts  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fso.OpenTextFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c:\\collect.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,ForAppending,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在这里是一个决对\l,用的时候必M?nbsp; </span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">   ts.WriteLine(external.menuArguments.document.selection.createRange().text);<br>   ts.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">#########################</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>   ts.close();  <br></span><span style="COLOR: #000000"></</span><span style="COLOR: #000000">script</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span></div> <p><br><br>然后在注册表中添加下面的?br>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\信息攉(&Q)</p> <p> </p> <p>讄两个键?/p> <p>默认 D:\rocket\Download\pagehook.htm   //卛_前存的htm文g,需要绝对\?br>contexts 243</p> <p>可以了(jin),以后可以在ie里面攉你要的文本了(jin).<br>使用的时?先用鼠标选择你需要的文字,然后右键?信息攉"菜单,可以把选择的文?br>存储到c:\collect.txt 中了(jin).</p> <img src ="http://www.shnenglu.com/hdqqq/aggbug/39180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hdqqq/" target="_blank">hdqqq</a> 2007-12-21 09:18 <a href="http://www.shnenglu.com/hdqqq/archive/2007/12/21/39180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc 中std::list 的size()成员函数http://www.shnenglu.com/hdqqq/archive/2007/12/11/38216.htmlhdqqqhdqqqTue, 11 Dec 2007 03:56:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/12/11/38216.htmlhttp://www.shnenglu.com/hdqqq/comments/38216.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/12/11/38216.html#Feedback18http://www.shnenglu.com/hdqqq/comments/commentRss/38216.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/38216.html阅读全文

hdqqq 2007-12-11 11:56 发表评论
]]>
关闭xp文g保护http://www.shnenglu.com/hdqqq/archive/2007/11/15/36662.htmlhdqqqhdqqqThu, 15 Nov 2007 03:13:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/11/15/36662.htmlhttp://www.shnenglu.com/hdqqq/comments/36662.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/11/15/36662.html#Feedback2http://www.shnenglu.com/hdqqq/comments/commentRss/36662.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/36662.html阅读全文

hdqqq 2007-11-15 11:13 发表评论
]]>
手工~译boost的bjamhttp://www.shnenglu.com/hdqqq/archive/2007/09/20/32541.htmlhdqqqhdqqqThu, 20 Sep 2007 06:00:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/09/20/32541.htmlhttp://www.shnenglu.com/hdqqq/comments/32541.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/09/20/32541.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/32541.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/32541.html阅读全文

hdqqq 2007-09-20 14:00 发表评论
]]>
昄字符串的函数http://www.shnenglu.com/hdqqq/archive/2007/07/31/29063.htmlhdqqqhdqqqTue, 31 Jul 2007 02:51:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/07/31/29063.htmlhttp://www.shnenglu.com/hdqqq/comments/29063.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/07/31/29063.html#Feedback5http://www.shnenglu.com/hdqqq/comments/commentRss/29063.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/29063.html阅读全文

hdqqq 2007-07-31 10:51 发表评论
]]>
创徏一个基于模板的数据库记录集操作c??http://www.shnenglu.com/hdqqq/archive/2007/03/26/20597.htmlhdqqqhdqqqMon, 26 Mar 2007 03:18:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/03/26/20597.htmlhttp://www.shnenglu.com/hdqqq/comments/20597.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/03/26/20597.html#Feedback3http://www.shnenglu.com/hdqqq/comments/commentRss/20597.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/20597.html阅读全文

hdqqq 2007-03-26 11:18 发表评论
]]>
创徏一个基于模板的数据库记录集操作c??http://www.shnenglu.com/hdqqq/archive/2007/01/31/18195.htmlhdqqqhdqqqWed, 31 Jan 2007 01:15:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/01/31/18195.htmlhttp://www.shnenglu.com/hdqqq/comments/18195.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/01/31/18195.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/18195.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/18195.html创徏一个基于模板的数据库记录集操作c??


ado装
前面讲了(jin)建立一个记录的l构和对variant数据l构q行转换,在这里?对ado接口q行装.微Y的ado数据操作接口是以com的Ş式发布的,在用import指o(h)对com的动态库q行导入之后,?x)在工程的输出目录下生成tlh和tli两个文g,tlh是于c和c++用于操作com接口的头文g,在其中声明了(jin)一?com接口和com对象?IID和CLSID,q有接口的属性和Ҏ(gu),都以c/c++可以用的形式做了(jin)转换,那个tli文g其实是tlh文g中声明的一些结构的成员函数的实?被tlh文g包含.在tlh文g?通过宏_COM_SMARTPTR_TYPEDEF用模板类_com_ptr_tҎ(gu)口进行了(jin)包装,


_COM_SMARTPTR_TYPEDEF是一个很奇怪的?最l生成的是一个以Ptrl尾的类?
_COM_SMARTPTR_TYPEDEF(Field15, __uuidof(Field15));
实际上生成的cȝ名称是Field15Ptrc? cd是_com_ptr_t<Field15, __uuidof(Field15)>

在我实现的模板类?没有打算在类的整个生命周期中拥有一个ADO接口的记录集成员或者或者ADOq接,我只打算在一些成员函C,通过局部变量来使用ADO接口.所以对adoq行?jin)部分的?

#define MAKE_ADO_COM_CLASS_TYPEDEF(e) typedef CComWrapper <  e##Ptr  >  CCom##e

template 
< typename  com_class >
class CComWrapper : 
public  com_class
{
private :
    void CreateInstance() {
        
int  i  =   100 ;
    }
public :    
    
    com_class 
&  operator = ( const  com_class &  cp) {
        com_class::operator
= (cp);
        return 
* this;
    }
    
    CComWrapper() {}
    
    CComWrapper(CLSID uid) {
        ::CoInitialize(
NULL );
        HRESULT hr 
=  com_class::CreateInstance(uid);
        
if  (FAILED(hr)) {
            
// AfxMessageBox(_T( " Create Com Object Error! " ));
            TRACE(_T(
" Create Com Object Error!\n " ));
        }
    }
    
    ~CComWrapper() {
        
if  (GetInterfacePtr())
            com_class::Release();
    }
};


MAKE_ADO_COM_CLASS_TYPEDEF(_Collection);
MAKE_ADO_COM_CLASS_TYPEDEF(_DynaCollection);
MAKE_ADO_COM_CLASS_TYPEDEF(_ADO);
MAKE_ADO_COM_CLASS_TYPEDEF(Properties);
MAKE_ADO_COM_CLASS_TYPEDEF(
Property );
MAKE_ADO_COM_CLASS_TYPEDEF(
Error );
MAKE_ADO_COM_CLASS_TYPEDEF(Errors);
MAKE_ADO_COM_CLASS_TYPEDEF(Command15);
MAKE_ADO_COM_CLASS_TYPEDEF(Connection15);
MAKE_ADO_COM_CLASS_TYPEDEF(_Connection);
MAKE_ADO_COM_CLASS_TYPEDEF(Recordset15);
MAKE_ADO_COM_CLASS_TYPEDEF(Recordset20);
MAKE_ADO_COM_CLASS_TYPEDEF(Recordset21);
MAKE_ADO_COM_CLASS_TYPEDEF(_Recordset);
MAKE_ADO_COM_CLASS_TYPEDEF(Fields15);
MAKE_ADO_COM_CLASS_TYPEDEF(Fields20);
MAKE_ADO_COM_CLASS_TYPEDEF(Fields);
MAKE_ADO_COM_CLASS_TYPEDEF(Field20);
MAKE_ADO_COM_CLASS_TYPEDEF(Field);
MAKE_ADO_COM_CLASS_TYPEDEF(_Parameter);
MAKE_ADO_COM_CLASS_TYPEDEF(Parameters);
MAKE_ADO_COM_CLASS_TYPEDEF(Command25);
MAKE_ADO_COM_CLASS_TYPEDEF(_Command);
MAKE_ADO_COM_CLASS_TYPEDEF(ConnectionEventsVt);
MAKE_ADO_COM_CLASS_TYPEDEF(RecordsetEventsVt);
MAKE_ADO_COM_CLASS_TYPEDEF(ConnectionEvents);
MAKE_ADO_COM_CLASS_TYPEDEF(RecordsetEvents);
MAKE_ADO_COM_CLASS_TYPEDEF(ADOConnectionConstruction15);
MAKE_ADO_COM_CLASS_TYPEDEF(ADOConnectionConstruction);
MAKE_ADO_COM_CLASS_TYPEDEF(_Record);
MAKE_ADO_COM_CLASS_TYPEDEF(_Stream);
MAKE_ADO_COM_CLASS_TYPEDEF(ADORecordConstruction);
MAKE_ADO_COM_CLASS_TYPEDEF(ADOStreamConstruction);
MAKE_ADO_COM_CLASS_TYPEDEF(ADOCommandConstruction);
MAKE_ADO_COM_CLASS_TYPEDEF(ADORecordsetConstruction);
MAKE_ADO_COM_CLASS_TYPEDEF(Field15);

在上面的代码?通过一个模板类CComWrapper,对ado生成的Ptrcd作了(jin)l承,主要是在析构函数中自动释放接?同时,我把tlh和tli着两个文gҎ(gu)?jin)一个h文g和一个inl文g,q样在用的时?׃用再使用import指o(h)?


hdqqq 2007-01-31 09:15 发表评论
]]>
创徏一个基于模板的数据库记录集操作c??http://www.shnenglu.com/hdqqq/archive/2007/01/22/17894.htmlhdqqqhdqqqMon, 22 Jan 2007 09:33:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/01/22/17894.htmlhttp://www.shnenglu.com/hdqqq/comments/17894.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/01/22/17894.html#Feedback1http://www.shnenglu.com/hdqqq/comments/commentRss/17894.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/17894.html
?一条记?br />
#define ROW_NO_CHANGE 0
#define ROW_ADD 
1
#define ROW_UPDATE 
2
#define ROW_DELETE 
3

template
<typename _tlist>
class data_op_record_row : 
public struct_mem<_tlist>
{
public:
    enum _enum_RowState {
        _en_Row_NoChange 
= ROW_NO_CHANGE,    //未修?br />        _en_Row_Add = ROW_ADD,            //新增记录
        _en_Row_Update 
= ROW_UPDATE,        //更新
        _en_Row_Del 
= ROW_DELETE,        //删除
    } m_en_State;
public:
    void SetState(
int newstate) {
        
if (m_en_State != newstate) {
            
if (newstate == _en_Row_NoChange || 
                newstate 
== _en_Row_Add || 
                newstate 
== _en_Row_Update || 
                newstate 
== _en_Row_Del) 
            {
                m_en_State 
= (_enum_RowState)newstate;
            }
        }
    }
public:
    data_op_record_row () : m_en_State(_en_Row_NoChange) {}
    ~data_op_record_row (){}
protected:
private:
};
上面的类增加?jin)一个枚?标识q条记录当前的状?在记录集?根据记录的状态进行相关的操作.q个其实cM?net中的DataRow,不过.net中的DataRow可以用wizzard生成需要的c?而这里是用模板生成的.

?数据cd转换
      数据库中的表对应的字D|不同的数据类?ADO操作接口中用不同的数据类型与之对?其中Field接口的GetType是q回字段cd?但是ADO的GetValueq回的是_variant_tcd,Z(jin)实际业务的需?q需要{换成不同的类?因此,需要对_variant_tcdq行转换.为此需要提供模板{换函?br />
template <typename _type>
void DbData_Change(_type
& ret, _variant_t& field)
{
   AfxMessageBox(
"未定义的数据转换");
}


template 
<>
void DbData_Change
<int>(int & ret, _variant_t& field)
{
    ret 
= field.lVal;
}

template 
<>
void DbData_Change
<std::string>(std::string& ret, _variant_t& field)
{
    _bstr_t temp;

    
if (field.vt != VT_NULL) {
        temp 
= field.bstrVal;
        ret 
= temp.operator const char*();
    }
}

template 
<>
void DbData_Change
<bool>(bool& ret, _variant_t& field)
{
    ret 
= (field.boolVal == (short)0xFFFF ? TRUE : FALSE);
}

template 
<>
void DbData_Change
<double>(double& ret, _variant_t& field)
{
    
if (field.vt != VT_NULL) {
        
//ret = field.cyVal;
        ret 
= field.dblVal;
    }
else {
        ret 
= 0;
    }
}

上面的模板函数的功能是从_variant_t转换到某中数据类?对于其它cdq可以进行扩?对于没有q行特化的函?~译器会(x)使用~省模板,在运行时候就?x)出现提C?有了(jin)上面的函?现在我们需要一个数据类型的装c?使得被封装的cd可以自动q行从_variant_tcd的需要类型的转换,所以有?jin)下面的装c?
//数据库数据类型封?br />template <typename _type>
class _db_data_wrapper
{
public:
    _type
& Value() {
        return m_Data;
    }

    
const _type& operator =(const _type& value) {
        m_Data 
= value;
        return value;
    }

    _db_data_wrapper
& operator = (const _db_data_wrapper& other) {
        
if (this != &other) {
            m_Data 
= other.m_Data;
        }
        return 
*this;
    }

public:
    virtual void GetDbValue(_variant_t
& field_value) {
        DbData_Change(m_Data, field_value);
    }

public:
    _db_data_wrapper(){}
    _db_data_wrapper(
const _type& value) : m_Data(value) {}
    ~_db_data_wrapper(){}
private:
    _type m_Data;
};

typedef _db_data_wrapper
< int > DB_INT;
typedef _db_data_wrapper
< std::string > DB_STRING;
typedef _db_data_wrapper
< bool > DB_BOOL;
typedef _db_data_wrapper
< double > DB_DOUBLE;



上面的代码预定义?jin)几U常用的数据cd,q个数据的封装类支持 = 操作W?因此可以直接用被装的数据对其赋?象下?br />
int i = 4;
DB_INT di;
di 
= i;
= di.Value();


同时通过成员函数GetDbValue(_variant_t& field_value), 支持从_variant_t转换w封装的cd.

现在,可以用上面的数据cd构徏记录l构?/p>

typedef data_op_record_row< TYPELIST_2(DB_INT,DB_STRING) > my_DataRow;

在上面的my_DataRowcd?有两个成员Field0, Field1,cd分别?DB_INT,DB_STRING, 支持_variant_tcd转换.

当然,用wrapperҎ(gu)据进行封装在实际的用中毕竟有些ȝ(ch), 如数据必通过 Value() 函数来取?如果直接使用?int, std::string {类型作?记录l构的成?也可以实现_variant自动转换,但是需要在上一层的记录集类中加入相关的转换操作,实现h比较ȝ(ch),所以我q里选择?jin)对数据q行装.


 



hdqqq 2007-01-22 17:33 发表评论
]]>
创徏一个基于模板的数据库记录集操作c?一)http://www.shnenglu.com/hdqqq/archive/2007/01/19/17774.htmlhdqqqhdqqqFri, 19 Jan 2007 02:35:00 GMThttp://www.shnenglu.com/hdqqq/archive/2007/01/19/17774.htmlhttp://www.shnenglu.com/hdqqq/comments/17774.htmlhttp://www.shnenglu.com/hdqqq/archive/2007/01/19/17774.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/17774.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/17774.html     c++在数据库开发这U需要进行快速开发的地方一直是以效率低下著U?borland 的c++ build 依赖vcl提供的组件勉强可以实?但是׃用的是pascal的东?根基不行,一直叫不响.再看看现在流行的数据?sql server 和mysql {虽然提供本地开发的头文件和?但是对于一些可能用不同数据库的应用来?选择特定某种数据库开发显然是不妥,因此,象adoq种数据操作接口大行光.q又l用c++开发带来了(jin)ȝ(ch),象vb{工具可以自动{换variantcd,但是在vc使用的时候却很麻?|上那些使用ado接口的c++的例?大多数都?import 那个dll开? 然后是J琐的创建instance,打开记录?最后还要进行一个variant到c++cd的{?实是够ȝ(ch)?难怪效率低?
 
    在很多情况下,一些数据查询和数据操作往往是在开发的时候就定下来?比如说你有个用户表要操作,你在开发的时候就知道q个表中的所有字D名U和字段cd,但是你用ado,你却q是要和J琐的variant打交?把它转换Z惌的数据类? 如果能实C个类,在知晓数据表字段cd的情况下,可以方便C用c++数据cd,q且可以q行诸如插入,删除,更新{操?那就方便多了(jin).  q就是本文想实现的目?  但是对于那些在运行时候才定的数据操?如用戯入一?sql 查询,然后再来q行操作,对于象c++ q种强类型的语言来说,可能除了(jin)使用 variant别无他法, 对于q方?本文没有l出解决办法.

本文中的代码在vc6下编译通过
需要的?loki for vc6, boost

一. 构造记录结?/p>

   通常来说,数据集由一条条的记录组?记录下有字段,记录是数据操作的基本单元.照c++的习(fn)?最好是一条记录一个结?字段是q个l构的成?然后用列表或者vectorl合一下就是记录集?但是一条记录的字段是有可能变动?q好,有loki ?typelist.

 

 1 #if !defined(INCLUDE_40697E96_B6DE_449D_A516_B0376650A488)
 2 #define I(yng)NCLUDE_40697E96_B6DE_449D_A516_B0376650A488
 3 
 4 #if _MSC_VER > 1000
 5 #pragma once
 6 #endif
 7 
 8 #include <typelist.h>
 9 #include <functor.h>
10 #include <boost/preprocessor/dec.hpp>
11 
12 #define HELP_2(a , b) a(b)
13 
14 #define MEM_STRUCT_MAKE_IMPL(n) template <typename _tlist> \
15 struct I(yng)n : public _str_impl_help<n>::template I(yng)n<typename _tlist::Tail> \
16 { \
17     typedef _str_impl_help<n>::template I(yng)n<typename _tlist::Tail> _Base; \
18     enum {    en_member_count = _Base::en_member_count+1, }; \
19     typedef typename ::Loki::TL::TypeAt<_tlist, 0>::Result _type##n; \
20     _type##n m_P##n; \
21     __declspec(property(get = GetF##n, put = PutF##n)) \
22     _type##n Field##n; \
23     _type##n GetF##n() { return m_P##n; } \
24     void PutF##n(const _type##n val) { m_P##n = val; } \
25 }; \
26 }
27 
28 #define MEM_STRUCT_MAKE(n) template <> \
29     struct _str_impl_help<n> { \
30     HELP_2(MEM_STRUCT_MAKE_IMPL, BOOST_PP_DEC(n))
31     
32 
33 namespace impl_help
34 {
35     template <int _p>
36     struct _str_impl_help;
37 
38     template <>
39     struct _str_impl_help<0> {};
40     template <>
41     struct _str_impl_help<1> {
42         template <typename _tlist> 
43         struct I(yng)n {
44             enum {
45                 en_member_count = 1,
46             };
47 
48             typename ::Loki::TL::TypeAt<_tlist, 0>::Result m_P0;
49 
50             __declspec(property(get=GetF0, put=PutF0))
51             typename ::Loki::TL::TypeAt<_tlist, 0>::Result Field0;
52 
53             typename ::Loki::TL::TypeAt<_tlist, 0>::Result GetF0() { 
54                 return m_P0; 
55             }
56 
57             void PutF0(const typename ::Loki::TL::TypeAt<_tlist, 0>::Result val) {
58                 m_P0 = val;
59             }
60         };
61     };
62 
63     MEM_STRUCT_MAKE(2);
64     MEM_STRUCT_MAKE(3);
65     MEM_STRUCT_MAKE(4);
66     MEM_STRUCT_MAKE(5);
67     MEM_STRUCT_MAKE(6);
68     MEM_STRUCT_MAKE(7);
69     MEM_STRUCT_MAKE(8);
70     MEM_STRUCT_MAKE(9);
71     MEM_STRUCT_MAKE(10);
72     MEM_STRUCT_MAKE(11);
73     MEM_STRUCT_MAKE(12);
74     MEM_STRUCT_MAKE(13);
75     MEM_STRUCT_MAKE(14);
76     MEM_STRUCT_MAKE(15);
77 }
78 
79 template <typename _tlist>
80 struct struct_mem : public impl_help::_str_impl_help< ::Loki::TL::Length<_tlist>::value >:: 
81     template I(yng)n< ::Loki::TL::Reverse<_tlist>::Result >
82 {
83 };
84 
85 
86 #endif //!defined(INCLUDE_40697E96_B6DE_449d_A516_B0376650A488)

上面是模板实现根据指定typelist,生成拥有相应成员的结?

typedef struct_mem< TYPELIST_6(DB_STRING, DB_STRING, DB_STRING, DB_STRING, DB_STRING, DB_STRING) > CustomerRow; 可以声明一个有6个成员的l构?
上面的代码用template的特化到?5个成员的l构,全部写出来的?重复而且ȝ(ch),所以用了(jin)宏来帮助生成.


 



hdqqq 2007-01-19 10:35 发表评论
]]>
?:操作W的新用?/title><link>http://www.shnenglu.com/hdqqq/archive/2006/12/29/16988.html</link><dc:creator>hdqqq</dc:creator><author>hdqqq</author><pubDate>Fri, 29 Dec 2006 09:06:00 GMT</pubDate><guid>http://www.shnenglu.com/hdqqq/archive/2006/12/29/16988.html</guid><wfw:comment>http://www.shnenglu.com/hdqqq/comments/16988.html</wfw:comment><comments>http://www.shnenglu.com/hdqqq/archive/2006/12/29/16988.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/hdqqq/comments/commentRss/16988.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hdqqq/services/trackbacks/16988.html</trackback:ping><description><![CDATA[ <p>?:操作W是一个条件赋值的操作W号,常用来对变量q行条g赋值如:<br /><br />int i = 1, j = 2;<br />int c_max = ( i > j ? i : j );<br /><br />不过今天看了(jin)|上的一D代?是这L(fng)?br /><br />(i->second.left ? file.leechers : file.seeders)--;<br /><br />上面的三个都是变?也可以编译通过,所以写?jin)段代码试?jin)一?br /><br /></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> show_1(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> val)<br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">function show_1 called!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> show_2(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> val)<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">function show_2 called!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> quest_test()<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">, b </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    (c</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> a : b)</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> a  </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> b </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">    (c </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> a : b)</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> a  </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> b </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    (c </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> show_1 : show_2)(</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">最后的输出?br /></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000"></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> and </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000"></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"> and </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">function show_1 called</span><span style="COLOR: #000000">!</span></div> <p> <br />最怪的?:操作W号,居然也可以用在函C.</p> <p>(c ? show_1 : show_2)(100);</p> <p>其实{同?/p> <p>if (c)<br />  show_1(100);<br />else<br />  show_2(100);</p> <p>不过l了(jin)很多.</p> <img src ="http://www.shnenglu.com/hdqqq/aggbug/16988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hdqqq/" target="_blank">hdqqq</a> 2006-12-29 17:06 <a href="http://www.shnenglu.com/hdqqq/archive/2006/12/29/16988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows下的bannerhttp://www.shnenglu.com/hdqqq/archive/2006/12/22/16716.htmlhdqqqhdqqqFri, 22 Dec 2006 02:13:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/12/22/16716.htmlhttp://www.shnenglu.com/hdqqq/comments/16716.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/12/22/16716.html#Feedback2http://www.shnenglu.com/hdqqq/comments/commentRss/16716.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/16716.html unixpȝ下的banner是用于显C点阵字体的E序cygwin下有cM的程序可以在windows下跑,但是不支持中?

所以自己写?jin)一个windows下的cME序,自己Z个控制台工程(需支持mfc)?把下面的代码复制一下就可以?同时,新年快到?大?

     #      ##       ##            #    ##         #    #### 
  ###### ###        #########      # #   #         #######   
    # #  #        ##   ##        # # ########      #   ##    
  ###### #######   ##########    # #     #  #     ##   ##    
 #  ##  ## ## #    ##  ##        # #     ####     ############
  ###### # ##    ###############   # ##########      # ###   
   ### ### ##    ##    ##  ####    #    # #  #      ## ## ## 
  #### ##  ##          ##          #   ## ##      ###  ##  ####
 #  ##  #  ##          ##          # ###   ##    #   # ##    ##
            #          ##          ##                 ##      

      8  88            8               8  8                88  
   8888888888     88888888888      88  8 88       88888    88  
      8  8         888888888       8   8          8 8 8 88888888
  8888 888888       8888888        888888888      8 8 8    8888
     888  88        88   88           88888       8 8 8   888  
   88  8   888        8888            88 88       8 8 8  8888  
8888 8 8888 888  88888888888888     88  88        888 8888 88  
    8  88 88 8      88888888     8888  88 888      8888    88  
   8 888 8 8        88    88        8888   8888  888  88 8888  
      88            88888888                 8             8   

使用方式

wbanner [-c 填充字符] [-f 字体名称] [-s 字体大小] 昄文本

/////////////////

//  wbanner_6.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#include 
" wbanner_6.h "

#ifdef _DEBUG
#define  new DEBUG_NEW
#undef  THIS_FILE
static   char  THIS_FILE[]  =  __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////// //
//  The one and only application object

CWinApp theApp;

using   namespace  std;


#define  BMP_WIDTH    100
#define  BMP_HEIGHT    30

void  ParseArg(CString &  info, CString &  fill_str,CString &  font_name,  int &  font_size,  int  argc,TCHAR *  argv[])
{
    
int  i;
    
for  (i  =   1 ; i  <  argc; i ++ ) {
        
if  (strcmp(argv[i],  " -c " ==   0   &&  i  <  argc) {
            fill_str 
=  argv[ ++ i];
            
continue ;
        }
        
if  (strcmp(argv[i],  " -f " ==   0   &&  i  <  argc) {
            font_name 
=  argv[ ++ i];
            
continue ;
        }
        
if  (strcmp(argv[i],  " -s " ==   0   &&  i  <  argc) {
            font_size 
=  atoi(argv[ ++ i]);
            
if  (font_size  <=   120
                font_size 
=   120 ;
            
continue ;
        }

        info 
=  argv[i];
        
break ;
    }
}

void  ShowBanner(LPCTSTR fill_str, LPCTSTR info, LPCTSTR font_name,  int  font_size)
{
    CFont lfont;
    CDC ldc;
    CBitmap lbmp;
    ldc.CreateCompatibleDC(NULL);
    lbmp.CreateCompatibleBitmap(
& ldc, BMP_WIDTH, BMP_HEIGHT);
    CBitmap
*  pold  =  (CBitmap * )ldc.SelectObject( & lbmp);
    
    lfont.CreatePointFont(font_size, font_name, 
& ldc);
    
    CFont
*  poldfont  =  (CFont * )ldc.SelectObject( & lfont);
    
    CRect lrect(
0 0 , BMP_WIDTH,BMP_HEIGHT);
    
    ldc.FillSolidRect(
0 , 0 , BMP_WIDTH, BMP_HEIGHT, RGB( 255 , 255 , 255 ));
    ldc.DrawText(info, 
& lrect, DT_LEFT);
    
    BITMAP bmp_head;
    
    lbmp.GetBitmap(
& bmp_head);
    
    
    DWORD bufsize 
=  bmp_head.bmWidthBytes * bmp_head.bmHeight;
    
char *  buf  =   new   char [bufsize];
    
    memset(buf, 
0 , bufsize);
    
    DWORD get_ret 
=  lbmp.GetBitmapBits(bufsize, ( void * )buf);
    
    
int  i,j;
    
if  (get_ret  !=   0 ) {
        
char  ret[ 2 =  {  13 10 };
        CString 
out [ 2 =  {fill_str,  "   " };
        
for  (i  =   0 ; i  <  bmp_head.bmHeight; i ++ )
        {
            
int  charcount  =   0 ;
            
for  (j  =   0 ; j  <  bmp_head.bmWidth; j ++ ) {
                
int  offset  =  bmp_head.bmWidthBytes * i + j / 8 ;
                
char  cur;
                cur 
=  buf[offset];
                
char  tt  =  cur  &  ( 0x80   >>  (j  %   8 ));
                CString temp;
                
if  (tt  ==   0 ) {
                    temp 
=   out [ 0 ];
                }
else  {
                    temp 
=   out [ 1 ];
                }
                cout 
<<  (LPCTSTR)temp;
                charcount
++ ;
            }
            cout 
<<  endl;
        }
    }
        
    ldc.SelectObject(pold);
    ldc.SelectObject(poldfont);
    delete [] buf;
}

void  PrintUsage( int  argc, TCHAR *  argv[])
{
    cout 
<<   " not enough arguments "   <<  endl;
    cout 
<<   " Usage: "   <<  endl;
    cout 
<<  argv[ 0 <<   "  [-c #] [-f font_name] [-s font_size] A string to print "   <<  endl;
}

int  _tmain( int  argc, TCHAR *  argv[], TCHAR *  envp[])
{
    
int  nRetCode  =   0 ;

    
//  initialize MFC and print and error on failure
     if  (AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(),  0 ))
    {
        
//  TODO: change error code to suit your needs

        CString info 
=   " wbanner " ;
        CString font_name 
=   " 宋体 " ;
        CString fill_str 
=   " # " ;
        
int  font_size  =   120 ;
        
        
        
if  (argc  <   2 ) {
            PrintUsage(argc, argv);
        }
else  {
            ParseArg(info, fill_str, font_name, font_size, argc, argv);
            ShowBanner(fill_str, info, font_name, font_size);
        }
    }
else  {
        cerr 
<<  _T( " Fatal Error: MFC initialization failed " <<  endl;
        nRetCode 
=   1 ;
    }
    
return  nRetCode;
}




hdqqq 2006-12-22 10:13 发表评论
]]>
unix 下的文g名大写相关http://www.shnenglu.com/hdqqq/archive/2006/12/11/16277.htmlhdqqqhdqqqMon, 11 Dec 2006 08:44:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/12/11/16277.htmlhttp://www.shnenglu.com/hdqqq/comments/16277.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/12/11/16277.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/16277.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/16277.html

hdqqq 2006-12-11 16:44 发表评论
]]>
用vs2003打开vs2005的工E文?/title><link>http://www.shnenglu.com/hdqqq/archive/2006/12/09/16156.html</link><dc:creator>hdqqq</dc:creator><author>hdqqq</author><pubDate>Fri, 08 Dec 2006 16:27:00 GMT</pubDate><guid>http://www.shnenglu.com/hdqqq/archive/2006/12/09/16156.html</guid><wfw:comment>http://www.shnenglu.com/hdqqq/comments/16156.html</wfw:comment><comments>http://www.shnenglu.com/hdqqq/archive/2006/12/09/16156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/hdqqq/comments/commentRss/16156.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hdqqq/services/trackbacks/16156.html</trackback:ping><description><![CDATA[ <font size="1">      今天在网上下载了(jin)一个c++的代?目文g是sln的文?<br />我双?yn)L开,vs2003报告?q个目文g是高版本的vs生成?目前不支?搞了(jin)半天q个目文g是vs2005生成?q种高货我当然没用q?装vs2005或者重新构建项目工E都比较ȝ(ch),所以从目文g上着?看看是否可以修改一?让我的vs2003可以? 随便找了(jin)一个vs2003生成的sln文g,和vs2005生成的看?都是cMxml的文?差别只是一个版本号不同,把两个文件修改ؓ(f)vs2003?.0 sln版本,vs2003q是不认.估计是vcproj的差?然后查看2003?005vcproj文g的差?也差不多,只是版本号上的差?所以想办法实验?jin)一? ?vs2005的sln文g删除,用文本编辑程序打开vcproj文g,vs2005生成的文?版本h8,00 我直接改成了(jin)vs2003?.10 然后保存vcproj文g,再双?yn)L开,vs2003通过?可以直接~译q行?vs2003q会(x)自动生成新的sln文g.</font> <img src ="http://www.shnenglu.com/hdqqq/aggbug/16156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hdqqq/" target="_blank">hdqqq</a> 2006-12-09 00:27 <a href="http://www.shnenglu.com/hdqqq/archive/2006/12/09/16156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hello world 汇编?/title><link>http://www.shnenglu.com/hdqqq/archive/2006/09/21/12792.html</link><dc:creator>hdqqq</dc:creator><author>hdqqq</author><pubDate>Thu, 21 Sep 2006 06:25:00 GMT</pubDate><guid>http://www.shnenglu.com/hdqqq/archive/2006/09/21/12792.html</guid><wfw:comment>http://www.shnenglu.com/hdqqq/comments/12792.html</wfw:comment><comments>http://www.shnenglu.com/hdqqq/archive/2006/09/21/12792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/hdqqq/comments/commentRss/12792.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hdqqq/services/trackbacks/12792.html</trackback:ping><description><![CDATA[ <p> <font color="#009900">;一个汇~版本的 hello world<br />;test.asm <br />;a hello world program with asm<br /></font>.386P<br />.model FLAT</p> <p>include listing.inc</p> <p>INCLUDELIB LIBCD<br />INCLUDELIB OLDNAMES</p> <p>PUBLIC _main<br />PUBLIC szHelloWorld<br />EXTERN _printf:NEAR</p> <p> <br />CONST SEGMENT<br /> szHelloWorld DB 'Hello World!', 0aH, 00H<br />CONST ENDS</p> <p>_TEXT SEGMENT</p> <p>_argc$ = 8<br />_argv$ = 12<br />_main PROC NEAR<br /> push OFFSET FLAT:szHelloWorld<br /> call _printf<br /> add esp, 4<br /> xor eax, eax <br /> ret 0<br />_main ENDP<br />_TEXT ENDS</p> <p>END<br /> <br />;~译命o(h)<br />;ml.exe    /c   /coff    test.asm<br />;link /out:test.exe /subsystem:console kernel32.lib test.obj<br /><br /></p> <img src ="http://www.shnenglu.com/hdqqq/aggbug/12792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hdqqq/" target="_blank">hdqqq</a> 2006-09-21 14:25 <a href="http://www.shnenglu.com/hdqqq/archive/2006/09/21/12792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL, Loki,Boost 中Functor比较之Boost?一)http://www.shnenglu.com/hdqqq/archive/2006/09/13/12424.htmlhdqqqhdqqqWed, 13 Sep 2006 13:39:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/09/13/12424.htmlhttp://www.shnenglu.com/hdqqq/comments/12424.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/09/13/12424.html#Feedback1http://www.shnenglu.com/hdqqq/comments/commentRss/12424.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/12424.html STL, Loki,Boost ?/span> Functor 比较?/span> Boost ?/span> ( )

       在这一部分?/span> , 要讨论的?/span> Boost 库中?/span> Function 的有兛_?/span> , 于前面两不同的?/span> ,Boost 库的规模相对?/span> Loki ?/span> STL 来说 , 在规模上大了(jin)很多 , q篇文章中讨论的?/span> boost 中的 functor 部分 , 写的不好之处 , Ƣ迎提出意见 . 写作本文使用的是 Boost 1_33_1 版本 , 同时参考了(jin) Boost 文档?/span> function 部分的说?/span> .

 

写在前面

?/span> Boost ?/span> Function 功能?/span> , 用到?/span> Boost ?/span> Preprocessor, 在这部分?/span> Boost 提供的宏预处理功能是很强大的 , 主要的宏功能?/span> 重复生成 (BOOST_PP_REPEAT_FROM_TO), 条g判断 (BOOST_PP_IF), q接 (BOOST_PP_CAT), 数值比?/span> (BOOST_PP_GREATER), 参数枚D (BOOST_PP_ENUM_PARAMS) {?/span> , 使用q些?/span> , 可以按照自己的需要用宏生成模板类或者代?/span> , 实在是一个很有效而且很创新的功能 , 可以说把预处理器的功能用C(jin)d造极的地?/span> . 不过 , 代h(hun)是要花更多的旉在编译上 , 我有一?/span> 18000 行代码的工程 , 在一个头文g中用了(jin) Preprocessor 产生一些模板代码后 , ~译旉从原先的 4 分钟一下子升到?/span> 8 分多U?/span> ( 我的机器比较?/span> ), 最后不得不写了(jin)个功?/span> Proxy c?/span> , 隔绝 cpp 文g对该头文件的依赖关系才羃短了(jin)~译旉 .

TypeTraits typetraits 的功能是在给定一个数据类型后 , 通过 c++ 的模板能?/span> , 来取得这个关于这个数据类型的相关信息 . ?/span> Loki 库中 , 也提供了(jin) TypeTrait 功能 . 常用的有 判断是否为指?/span> , 判断是否为常?/span> , 判断是否为引?/span> , 判断是否为数值等 . 在创建模板类或者函数的时?/span> , 有时候需要根据模板参数的cdҎ(gu)板进行特?/span> , q是一个很重要的辅助功?/span> ,boost 中也?/span> typetrait 功能 , ?/span> functor 生成的过E中 , 也用了(jin)一?/span> typetrait 的功?/span> .

 

 

Boost 的的 Functor 的头文g位于 <boost/function.hpp> 文g?/span> , 有一个很重要的宏

BOOST_FUNCTION_MAX_ARGS 用于 定义 boost 的预处理器展开?/span> Functor 最多的参数个数 , ~省的定义ؓ(f)

#define   BOOST_FUNCTION_MAX_ARGS   10

如果有需要扩?/span> Functor 的参C?/span> , 可以在包?/span> Boost Functor 头文件之?/span> , 自己定义q个宏的数?/span> , 但是 , 最多可以到 50, 过q个数值后 , 需要手工修?/span> <boost/function/detail/maybe_include.hpp> 中的代码 , ?/span> Functor 可以使用的参数再q行扩充 .

 

Boost ?/span> Functor 的展开

       ?/span> Boost 中用了(jin)预处理元~程提供的叠代头文g的功?/span> , 反复叠代 <boost/function/function_template.hpp>, 最l生成用所需要的模板c?/span>

 

boost::function < q回?/span> ( 参数 [, 参数 ]?>, 用户可以使用~译器的 /P( 微Y c++ ~译?/span> ),  -save-temps(gcc ~译?/span> ) 开查看宏展开后的文g .

 

 

 

有关 STL ?/span> Loki 中的 Functor 的前面两位于我的另外一?/span> blog

http://blog.csdn.net/hdqqq/archive/2006/02/07/593877.aspx

http://blog.csdn.net/hdqqq/archive/2006/01/25/588348.aspx



hdqqq 2006-09-13 21:39 发表评论
]]>
shell 脚本http://www.shnenglu.com/hdqqq/archive/2006/09/06/12096.htmlhdqqqhdqqqWed, 06 Sep 2006 09:18:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/09/06/12096.htmlhttp://www.shnenglu.com/hdqqq/comments/12096.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/09/06/12096.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/12096.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/12096.html /*
 q几天在~译firefox,Z学一下unix下的shell的脚本编?unix下的道和工?br />l合h用的?功能实强大.写了(jin)个测试的脚本,功能是把c/cpp/h文g中所有包含的头文?br />扑և?支持通配W?
 可以把下面的文字复制到某个文?然后另存?sh后缀的文件放?bin目录下就可以q行??br />cygwin环境下测试通过.
*/

## list_head.sh

ARR_NUM=1

if [ $# -lt $ARR_NUM ]
then
echo "使用方式:"
echo "$0 文g?
echo "文g? C/CPP/H 文g ?通配W?*.c(*.cpp)"
else

cat $@ | grep include | grep \# | sort | uniq | awk -Finclude '{ print $2 }' | tr -d \" | tr -d \' | tr -d \< | tr -d \> | sort | uniq | awk '{ print $1 }'

fi

exit 0



hdqqq 2006-09-06 17:18 发表评论
]]>
~译firefoxhttp://www.shnenglu.com/hdqqq/archive/2006/09/03/11997.htmlhdqqqhdqqqSun, 03 Sep 2006 10:14:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/09/03/11997.htmlhttp://www.shnenglu.com/hdqqq/comments/11997.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/09/03/11997.html#Feedback0http://www.shnenglu.com/hdqqq/comments/commentRss/11997.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/11997.html 前几天心(j)血来潮 , 惌q译一?/span> firefox 试试?/span> , 折腾?jin)好几?/span> , l于完成?/span> .

写篇文章ȝ一?/span> .

我编译的环境 :

1.       VC6 + sp5

2.       firefox ~译需要的辅助工具 wintools.zip

3.       cygwin 环境

 

准备工作 :

1.       下蝲 firefox E序代码Q在 mozilla 的站点上可以下蝲刎ͼ我编译的?/span> firefox 1.5.0.6 版本

2.       下蝲~译需要的 wintools.zip 工具 ,1.73MB 大小 , 其中带有 glib ?/span> libidl ?/span> , 在下载解压羃?/span> , 建立一个环境变?/span> MOZ_TOOLS 到某个目?/span> , 然后q入解压~后?/span> windows 目录 , q行 install.bat 文g , 安装相关需要的文g .

3.       安装 cygwin 环境 , 一?/span> window 下的c?/span> unix q_ , q里需要注意的?/span> , 最新的 cygwin ?/span> , 安装?/span> make 版本?/span> 3.81 ?/span> , 而编?/span> firefox 需要的?/span> 3.80 版本?/span> make, 解决的方法是?/span> cygwin 的某?/span> ftp 镜像站点上去下一?/span> 3.80 版本的文?/span> , 安装?/span> cygwin 安装目录下的 /bin 目录下就可以?/span> .

其中~译 firefox 需要的基本工具

ash -- UNIX-like command line interpreter shell (Base category)

coreutils -- GNU core utilities (includes fileutils, install, sh-utils, and textutils) (Base category)

cvs -- concurrent versions system (Devel category)

diffutils -- file comparison utility (Base category)

findutils (Base category)

gawk -- pattern matching language (Base and Interpretors categories)

grep -- text search tool (Base category)

libiconv -- character set conversion (Devel category)

make 3.80 (not 3.81!) -- dependency analyzer for software builds (Devel category)

patchutils -- a small collection of programs that operate on patch files (Devel category)

perl -- a scripting language used to control parts of the build (Interpreters category)

sed -- a search and replace language (Base category)

unzip -- zip file extraction (Archive category)

zip -- zip file creation (Archive category)

可以?/span> cygwin 命o(h)H口中输入相兛_令检是否安装了(jin)相关的程?/span> ., 其实如果下蝲?/span> firefxo 源代码的?/span> , ?/span> cvs 中的都不是必ȝ .

4.       安装 vc6 + sp5, ~译 firefox 1.5.0.6, 推荐的是 vc6 ?/span> cpp ~译?/span> . ?/span> vs6 安装?/span> , ?x)自动设|相关的 path,include ?/span> lib 环境变量 . 有一个需要注意的?/span> , vc6 ?/span> link.exe ?/span> cygwin 中的 link.exe 是相同的名字 , Z(jin)避免在编译的时?/span> , 调用错误?/span> link 执行文g , 可以?/span> cygwin/bin 中的 link.exe 改名?/span> glink.exe 避免冲突 . Vs ?/span> sp5 补丁也需要打一?/span> , 否则 , 生成?/span> xpldl.exe(firefox 用来~译 idl 文g的工?/span> ) 在编?/span> idl q程中会(x)报错 .

5.       配置文g

在环境和~译工具准备好后 , 解压~?/span> firefox 的代?/span> , 然后?/span> firefox 代码目录?/span> mozilla 目录?/span> , 建立一个名?/span> .mozconfig 的文?/span> , q在其中~辑文本

. $topsrcdir/browser/config/mozconfig

ac_add_options --enable-optimize

ac_add_options --disable-debug

ac_add_options --enable-static

ac_add_options --disable-shared

ac_add_options --disable-test

开?/strong>

上面所有工作完成之?/span> , 启动 cygwin 命o(h)H口 , q入 firefox 代码?/span> mozilla 目录

输入 make –f client.mk build 命o(h)开始编?/span> , 一切顺利的?/span> , 几十分钟?/span> , ׃(x)有一?/span> firefox 的执行文件生成到 mozilla/dist/bin 目录?/span> .

需要注意的?/span> , 在生成一?/span> test 的模块的时?/span> , ?x)报一?/span> jsint cd未定?/span> , q个无关紧要 , 因ؓ(f) firefox 已经生成?/span> , q是一个测试模?/span> , 我的解决Ҏ(gu)?/span> , 打开那个出错的cpp文g,加入

#ifdef   _MSCVER

typedef  int  int32;

#endif

然后再编译就可以?/span> , 所谓自动动?/span> , 丰衣食 , 有的时?/span> , 实在不行的话 , 需要把 firefox 的代码自己动手改一?/span> .

 

 



hdqqq 2006-09-03 18:14 发表评论
]]>
zlib 压羃道http://www.shnenglu.com/hdqqq/archive/2006/09/01/11920.htmlhdqqqhdqqqFri, 01 Sep 2006 05:03:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/09/01/11920.htmlhttp://www.shnenglu.com/hdqqq/comments/11920.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/09/01/11920.html#Feedback7http://www.shnenglu.com/hdqqq/comments/commentRss/11920.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/11920.html  

/*

    Zlib 是常用的压羃?在很多^C使用,是用c和部分汇~完成的,提供的是Zc接口的用函?o:p>

?span lang="EN-US">zlib 的contrib中提供了(jin)三种Ziostream的用方?

 

   在MFC?l常使用CFileq行文g的读写操?在这U时?如果想用Zlib的话,要么使用zlib自n

提供的操作函?span lang="EN-US">,要么使用zlib contrib中iostream操作?或者自己对zlibq行装.

 

所以我对zlibq行?jin)封?便于使用.

 

Filter 功能c?o:p>

zlib_compress_filter<int 压羃U别> 实现压羃功能c?Ҏ(gu)模板参数实现不同的压~程?  

zlib_uncompress_filter<int >  实现解压功能c?模板参数Mؓ(f) 1


Filterc自w带?~冲? 可以存储处理后的数据,用户可以直接通过q两个Filtercd数据q行

压羃和解压羃操作.

 

Pipec?o:p>

    Z(jin)和MFC中的CFilec进行配?Ҏ(gu)据进行处理后,把CFile作ؓ(f)最后接受数据的容器,cM?o:p>

Boost库中的Sink,提供?jin)一个模板实现的BufferPipe模板c?

 

template <typename filter,typename buffer_type, typename next_pipe> class BufferPipe;

模板参数:

filter  数据处理用filter

buffer_type ~冲cd

next_pipe 后面接的pipe,可以是CFile,用于最l写入磁?

 

 

Pipe后还可以接一个Pipe,可以象一个管子连接v?q且,以后通过扩充f(xi)ilter可以实现不同的数据操作功?

 

提供?jin)一个测试代?span lang="EN-US">

~译后一个对话框 四个 按钮

 

按钮1 ?c:\a.bmp  压羃?c:\b.cr     使用filter

按钮2 ?c:\b.cr  解压~ؓ(f) c:\c.bmp   使用filter

按钮3 ?c:\a.bmp 压羃?c:\d.cr   使用pipe功能

按钮4 ?c:\a.bmp  通过压羃和解压羃道, 存储?e.bmp应该和a.bmp相同,用于试道的连接功? 
 

代码位置:

http://www.shnenglu.com/files/hdqqq/z_file.rar

~译需要的zlib 误行到该库的网站下?

q个文章实现的和boost中的filtercM的功?可以和MFC配合使用.

:

fiter 使用?buf_holder写得比较_糙,以后有机?x)的?改进.

*/

 



hdqqq 2006-09-01 13:03 发表评论
]]>
数组取大?/title><link>http://www.shnenglu.com/hdqqq/archive/2006/08/24/11641.html</link><dc:creator>hdqqq</dc:creator><author>hdqqq</author><pubDate>Thu, 24 Aug 2006 05:35:00 GMT</pubDate><guid>http://www.shnenglu.com/hdqqq/archive/2006/08/24/11641.html</guid><wfw:comment>http://www.shnenglu.com/hdqqq/comments/11641.html</wfw:comment><comments>http://www.shnenglu.com/hdqqq/archive/2006/08/24/11641.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/hdqqq/comments/commentRss/11641.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hdqqq/services/trackbacks/11641.html</trackback:ping><description><![CDATA[ <p>在有些时?需要对预设的数l进行@环操?/p> <p>?/p> <p>char char_array[] = {'a','b','c','d'};<br />int i;<br />for (i = 0; i < sizeof(char_array)/sizeof(char); i++) {<br />    cout << char_array[i] << endl;<br />}</p> <p>所以写?jin)个?取得数组的大?/p> <p>template <typename T><br />T get_size(T value[]);</p> <p>#define ASIZEOF(a) sizeof(a)/sizeof(get_size(a))</p> <p>然后可以这样写?<br />for (i = 0; i < ASIZEOF(char_array); i++) {<br />    cout << char_array[i] << endl;<br />}</p> <p>但是~点是不能正确的分别传入的是一个指针类?q是一个类型的数组.</p> <p> <br />代码在vc6 ?devcpp 4.9 中测试通过</p> <p> <br /> </p> <img src ="http://www.shnenglu.com/hdqqq/aggbug/11641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hdqqq/" target="_blank">hdqqq</a> 2006-08-24 13:35 <a href="http://www.shnenglu.com/hdqqq/archive/2006/08/24/11641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个读取xml配置文g的通用模板http://www.shnenglu.com/hdqqq/archive/2006/02/13/3234.htmlhdqqqhdqqqMon, 13 Feb 2006 08:17:00 GMThttp://www.shnenglu.com/hdqqq/archive/2006/02/13/3234.htmlhttp://www.shnenglu.com/hdqqq/comments/3234.htmlhttp://www.shnenglu.com/hdqqq/archive/2006/02/13/3234.html#Feedback9http://www.shnenglu.com/hdqqq/comments/commentRss/3234.htmlhttp://www.shnenglu.com/hdqqq/services/trackbacks/3234.html阅读全文

hdqqq 2006-02-13 16:17 发表评论
]]>
޹þþۺվ| ƷӰӾþۺ| Ʒþþþþ| պŷۺϾþӰԺd3| ƷŮٸAVѾþ| þþþ޾Ʒһ| ɫۺϾþþþ| þ99þëƬһ| þۺŷ| ƷþþþӰԺ۲ | һþ㽶| þùҹƵ| ھƷþþþþҰ| ŮƷþþþ| þ99Ʒ99þ| ۺϾþĻ| ƷŮþþ| Ʒպҹþ| ݺɫþۺ_| þþƷԭ| ղƷ99þþþþ| þó˾ƷƵ| þþþAV| ޾ƷþþþAV鶹| þþŷղAV| þۺϸϾþù | þþþ޾Ʒַ| ԭۺϾþô˵| 97Ʒ˾þþô߽| þøݾƷԴվ| ŷպþAV| ޾Ʒþþþ66| 99鶹þþùƷ| ŷƷһþ| պ뾫Ʒþһ| ޹˾þþƷ| ھƷžžþþƷ| 99þþƷһ | þAVӰ| 99þùۺϾƷӰԺ| ޾Ʒþþþþ|