我正在寻找一种优雅的解决方案,用于在C ++中实现C#using语句的等价物。理想情况下,生成的语法应该易于使用和阅读。
C#使用声明详细信息在这里 - http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx
我不确定解决方案是使用带有类的析构函数的函数指针,某种形式的巧妙模板编程甚至是元模板编程。基本上我不知道从哪里开始...
答案 0 :(得分:26)
您无需在C ++中实现此功能,因为RAII的标准模式已经满足您的需求。
{
ofstream myfile;
myfile.open("hello.txt");
myfile << "Hello\n";
}
当块范围结束时,销毁myfile
,关闭文件并释放与该对象关联的所有资源。
C#中存在using
语句的原因是在try / finally和IDisposable
周围提供一些语法糖。在C ++中根本不需要它,因为这两种语言不同,每种语言的问题都有不同的解决方法。
答案 1 :(得分:3)
我看一下使用std :: auto_ptr&lt;&gt;处理在特定范围内分配和分配给指针的任何实例的清理 - 否则,在退出所述范围时,任何在特定范围内声明的变量都将被破坏。
{
SomeClass A;
A.doSomething();
} // The destructor for A gets called after exiting this scope here
{
SomeClass* pA = new SomeClass();
std::auto_ptr<SomeClass> pAutoA(pA);
pAutoA->doSomething();
} // The destructor for A also gets called here, but only because we
// declared a std::auto_ptr<> and assigned A to it within the scope.
有关std :: auto_ptr&lt;&gt;
的更多信息,请参阅http://en.wikipedia.org/wiki/Auto_ptr答案 2 :(得分:3)
类似于C#的using语句的更详细的RAII模式可以通过一个简单的宏来完成。
#define Using(what, body) { what; body; }
Using(int a=9,
{
a++;
})
a++; // compile error, a has gone out of scope here
请注意,我们必须使用大写“使用”来避免与C ++内置的“使用”语句发生冲突,这种语句显然具有不同的含义。
答案 3 :(得分:2)
我建议您阅读以下链接:
答案 4 :(得分:1)
看看以下内容:
#include <iostream>
using namespace std;
class Disposable{
private:
int disposed=0;
public:
int notDisposed(){
return !disposed;
}
void doDispose(){
disposed = true;
dispose();
}
virtual void dispose(){}
};
class Connection : public Disposable {
private:
Connection *previous=nullptr;
public:
static Connection *instance;
Connection(){
previous=instance;
instance=this;
}
void dispose(){
delete instance;
instance = previous;
}
};
Connection *Connection::instance=nullptr;
#define using(obj) for(Disposable *__tmpPtr=obj;__tmpPtr->notDisposed();__tmpPtr->doDispose())
int Execute(const char* query){
if(Connection::instance == nullptr){
cout << "------- No Connection -------" << endl;
cout << query << endl;
cout << "------------------------------" << endl;
cout << endl;
return -1;//throw some Exception
}
cout << "------ Execution Result ------" << endl;
cout << query << endl;
cout << "------------------------------" << endl;
cout << endl;
return 0;
}
int main(int argc, const char * argv[]) {
using(new Connection())
{
Execute("SELECT King FROM goats");//out of the scope
}
Execute("SELECT * FROM goats");//in the scope
}
答案 5 :(得分:1)
<div class="col-md-auto">
<input type="checkbox" name="delete[]" />
</div>
<div class="col col-xs-11">
...
</div>