| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Visual C++教程 > 文章正文 用户登录
Visual C++实现Fl
再谈在VB中调用VC
Visaul C++6.0中使
Visual C++编程技
Visual C++编程技
Visual C++编程技
Visual C++编程技
Visual C++编程技
Thinking again i
CUJ:标准C++编程

C++语法游戏 : 模仿C#的 using(...){}           

C++语法游戏 : 模仿C#的 using(...){}

作者:佚名 来源:CSDN 作者: Lostinet 更新:2006-8-25 21:05:35 错误报告 我要投稿
游戏而已,,可以用来锻炼脑筋。。~~



//using.h

#pragma once

//for IUnknown

#include "atlbase.h"

#define USING_SCOPE_ASSERT(x) ATLASSERT(x);

#define USING_SCOPE_INLINE inline

#define Using(expression) if(UsingScope UsingScope_LocalVar=(expression))

class UsingScope

{

 class Container

 {

 public:

  virtual ~Container()

  {

  }

 };

 Container* pc;

public:

 USING_SCOPE_INLINE operator bool ()

 {

  return true;

 }

 USING_SCOPE_INLINE ~UsingScope()

 {

  delete pc;

 }

 template

 class SimplePointerContainer:public Container

 {

  T* p;

 public:

  SimplePointerContainer(T* p)

  {

   USING_SCOPE_ASSERT(p!=NULL);

   this->p=p;

  }

  virtual ~SimplePointerContainer()

  {

   delete p;

  }

 };

 template

 USING_SCOPE_INLINE UsingScope(T* p)

 {

  pc=new SimplePointerContainer(p);

 }

 class IUnknownContainer:public Container

 {

  IUnknown* punk;

 public:

  IUnknownContainer(IUnknown* punk)

  {

   USING_SCOPE_ASSERT(punk!=NULL);

   this->punk=punk;

  }

  virtual ~IUnknownContainer()

  {

   punk->Release();

  }

 };

 USING_SCOPE_INLINE UsingScope(IUnknown* punk)

 {

  pc=new IUnknownContainer(punk);

 }

 class BSTRContainer:public Container

 {

  BSTR bstr;

 public:

  BSTRContainer(BSTR bstr)

  {

   USING_SCOPE_ASSERT(bstr!=NULL);

   this->bstr=bstr;

  }

  virtual ~BSTRContainer()

  {

   SysFreeString(bstr);

  }

 };

 USING_SCOPE_INLINE UsingScope(BSTR bstr)

 {

  pc=new BSTRContainer(bstr);

 }

 //vc7 m 可以为System::IDisposable* 添加 .Dispose() 的调用

 //以支持所有的dotnet System::IDisposable的实现者

};





//usingT.h

#include "Using.h"

#define UsingT(type,varname,expression) if(UsingScopeT varname=(expression))

template

class UsingScopeT

{

 template

 class Container

 {

 public:

  T* p;

  Container(T* p)

  {

   USING_SCOPE_ASSERT(p!=NULL);

   this->p=p;

  }

  virtual ~Container(){}

 };

 Container* pc;

public:

 USING_SCOPE_INLINE operator bool ()

 {

  return true;

 }

 USING_SCOPE_INLINE T* operator -> ()

 {

  return (pc->p);

 }

 USING_SCOPE_INLINE operator T*() const

 {

  return (T*)(pc->p);

 }

 USING_SCOPE_INLINE T& operator*() const

 {

  return *(pc->p);

 }

 USING_SCOPE_INLINE T** operator&()

 {

  return &(pc->p);

 }

 USING_SCOPE_INLINE bool operator==(T* pT) const

 {

  return (pc->p) == pT;

 }

 USING_SCOPE_INLINE ~UsingScopeT()

 {

  delete pc;

 }

 template

 class SimplePointerContainer:public Container

 {

 public:

  SimplePointerContainer(T* p):Container(p)

  {

  }

  virtual ~SimplePointerContainer()

  {

   delete p;

  }

 };

 template

 USING_SCOPE_INLINE UsingScopeT(T* p)

 {

  pc=new SimplePointerContainer(p);

 }

 class IUnknownContainer:public Container

 {

 public:

  IUnknownContainer(IUnknown* punk):Container(punk)

  {

  }

  virtual ~IUnknownContainer()

  {

   p->Release();

  }

 };

 USING_SCOPE_INLINE UsingScopeT(IUnknown* punk)

 {

  pc=new IUnknownContainer(punk);

 }

 class BSTRContainer:public Container

 {

 public:

  BSTRContainer(BSTR bstr):Container(bstr)

  {

  }

  virtual ~BSTRContainer()

  {

   SysFreeString(p);

  }

 };

 USING_SCOPE_INLINE UsingScopeT(BSTR bstr)

 {

  pc=new BSTRContainer(bstr);

 }

 //vc7 m 可以为System::IDisposable* 添加 .Dispose() 的调用

 //以支持所有的dotnet System::IDisposable的实现者

};





//Using.Cpp

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

//

#include "stdafx.h"

#include "atlbase.h"

#include "Using.h"

#include "UsingT.h"

class ClassA

{

public:

 ClassA()

 {

  _tprintf(_T("ClassA()\n"));

 }

 virtual ~ClassA()

 {

  _tprintf(_T("~ClassA()\n"));

 }

 virtual void Write()

 {

  _tprintf(_T("ClassA::Write\n"));

 }

};

class ClassB:public ClassA

{

public:

 virtual void Write()

 {

  _tprintf(_T("ClassB::Write\n"));

 }

};

ClassA* CreateClassA()

{

 return new ClassB();

}

IUnknown* ReturnUnknown()

{

 HRESULT hres;

 IUnknown* p;

 CLSID cid;

 hres=CLSIDFromProgID(L"JScript",&cid);

 hres=CoGetClassObject(cid,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(void**)&p);

 return p;

}

void DoIt()

{

 CoInitialize(NULL);

 IUnknown* punk;

 Using(punk=ReturnUnknown())

 {

  ClassA* pa;

  Using(pa=CreateClassA())

  {

   _tprintf(_T("DoWork\n"));

   pa->Write();

  }

 }

 UsingT(ClassB,pb,new ClassB())

 {

  pb->Write();

  ClassA* pa=pb;

  if(pa==pb)

   pa->Write();

 }

 UsingT(IUnknown,p,ReturnUnknown())

 {

  //p->..

 }

 CoUninitialize();

}



int main(int argc, char* argv[])

{

 DoIt();

 return 0;

}

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。