C++语法游戏之,模拟C#的using(...){}
游戏而已,,可以用来锻炼脑筋。。~~
//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<typename T>
class SimplePointerContainer:public Container
{
T* p;
public:
SimplePointerContainer(T* p)
{
USING_SCOPE_ASSERT(p!=NULL);
this->p=p;
}
virtual ~SimplePointerContainer()
{
delete p;
}
};
template<typename T>
USING_SCOPE_INLINE UsingScope(T* p)
{
pc=new SimplePointerContainer<T>(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<type> varname=(expression))
template<typename T>
class UsingScopeT
{
template<typename T>
class Container
{
public:
T* p;
Container(T* p)
{
USING_SCOPE_ASSERT(p!=NULL);
this->p=p;
}
virtual ~Container(){}
};
Container<T>* 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<typename T>
class SimplePointerContainer:public Container<T>
{
public:
SimplePointerContainer(T* p):Container<T>(p)
{
}
virtual ~SimplePointerContainer()
{
delete p;
}
};
template<typename T>
USING_SCOPE_INLINE UsingScopeT(T* p)
{
pc=new SimplePointerContainer<T>(p);
}
class IUnknownContainer:public Container<IUnknown>
{
public:
IUnknownContainer(IUnknown* punk):Container<IUnknown>(punk)
{
}
virtual ~IUnknownContainer()
{
p->Release();
}
};
USING_SCOPE_INLINE UsingScopeT(IUnknown* punk)
{
pc=new IUnknownContainer(punk);
}
class BSTRContainer:public Container<OLECHAR>
{
public:
BSTRContainer(BSTR bstr):Container<OLECHAR>(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;
}
相关推荐
C-Sharp:C#中的代码可以帮助您
C#的语法与C++和Java有诸多相似之处,但它的设计目标是提供更高级别的抽象,使得开发过程更加高效且易于维护。
C#实现的魔兽世界模拟器源码解析
C#(发音为 "看"),是一种由微软公司开发的面向对象的高级编程语言,它于2000年随着.NET平台首次被引入。C#的设计目的是为了结合C++的强大功能与Visual Basic的易用性,为开发者提供一个简洁、现代、类型安全的编程语言。C#是基于组件的编程范式,它允许程序员创建可重用的代码模块,称为组件。C#语言不仅语法清晰,而且拥有丰富的库和框架支持,使其成为开发Windows平台应用、云服务、移动应用以及游戏开发的首选语言之一。C#的设计哲学强调安全性、现代性和通用性。
C++ 与 C# 代码互相调用
C++ 和 C# 代码的互相调用为软件开发带来了更多的灵活性和功能扩展性,通过多种方式如动态链接库、COM 组件、C++/CLI 以及代理存根机制等,可以根据不同的应用场景和需求实现两者之间有效的交互。然而,在实现互调的过程中,也面临着诸多挑战,包括数据类型转换、内存管理、调试困难以及性能优化等方面的问题,需要开发者充分了解两种语言的特点、互调机制的原理以及相关的工具和技术,才能顺利地完成跨语言的代码集成,开发出高质量、高性能的软件系统。
送给女朋友的小程序 小游戏 c# c++ 表达爱情 耍点小坏 小可爱
它拥有强大的类型系统和垃圾回收机制,语法简洁,适合快速开发。而C++则是一种更为底层的语言,具有更高的性能和灵活性,常用于系统软件、游戏引擎、高性能计算等领域。
C# 基础语法.pdf (纯干货)
C#的设计目标是提供一种现代的、类型安全的、面向对象的语言,支持组件编程,并能运行在.NET框架上。其语法受到了C++和Java的影响,但更加强调代码的安全性和可维护性。


工具平台和程序库
