使用语句实现C ++等效的C#

时间:2012-02-03 17:56:00

标签: c# c++ templates using-statement

我正在寻找一种优雅的解决方案,用于在C ++中实现C#using语句的等价物。理想情况下,生成的语法应该易于使用和阅读。

C#使用声明详细信息在这里 - http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx

我不确定解决方案是使用带有类的析构函数的函数指针,某种形式的巧妙模板编程甚至是元模板编程。基本上我不知道从哪里开始...

6 个答案:

答案 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>