Внедрение эквивалента С++ с использованием оператора С#
Я ищу элегантное решение для реализации эквивалента оператора С# 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", которое, очевидно, имеет другое значение.
Ответ 4
Я бы рекомендовал прочитать следующие ссылки:
Ответ 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
}