Внедрение эквивалента С++ с использованием оператора С#

Я ищу элегантное решение для реализации эквивалента оператора С# using в С++. В идеале результирующий синтаксис должен быть прост в использовании и чтении.

С# Использование информации о данном примере - http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx

Я не уверен, будет ли решение использовать указатели функций с деструкторами на классах, какую-то форму умного программирования шаблонов или даже мета-шаблонов. В принципе я не знаю, с чего начать...

Ответ 1

Вам не нужно реализовывать это на С++, потому что стандартный шаблон RAII уже делает то, что вам нужно.

{
    ofstream myfile;
    myfile.open("hello.txt");
    myfile << "Hello\n";
}

Когда область блока заканчивается, myfile уничтожается, который закрывает файл и освобождает любые ресурсы, связанные с объектом.

Причина, по которой оператор using существует в С#, заключается в предоставлении некоторого синтаксического сахара вокруг try/finally и IDisposable. Это просто не нужно в С++, потому что эти два языка различаются, и проблема решается по-разному на каждом языке.

Ответ 2

Я бы посмотрел на использование std:: auto_ptr < > для обработки очистки любых экземпляров, выделенных и назначенных указателю в определенной области - в противном случае любые переменные, объявленные в определенной области, будут просто разрушены при выходе указанный объем.

{
    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.

Смотрите http://en.wikipedia.org/wiki/Auto_ptr для получения дополнительной информации о std:: auto_ptr < >

Ответ 3

Более подробный шаблон RAII, похожий на оператор С# using, может быть выполнен с помощью простого макроса.

#define Using(what, body) { what; body; }

Using(int a=9,
{
    a++;
})

a++; // compile error, a has gone out of scope here

Обратите внимание, что мы должны использовать капитал "Использование", чтобы избежать столкновения с С++, встроенного в выражение "using", которое, очевидно, имеет другое значение.

Ответ 5

посмотрите следующее:

#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

}