Вы можете вернуть вспомогательный объект из function1
по значению, которое вызывает в его деструкторе function2
.
Рассмотрите этот пример:
#include <iostream>
using namespace std;
void function2( int i, int j ) {
cout << "function2 called with " << i << " and " << j << endl;
}
struct Function2Caller {
Function2Caller( int param1, int param2 ) : m_param1( param1 ), m_param2( param2 ) {}
~Function2Caller() { function2( m_param1, m_param2 ); }
int m_param1, m_param2;
};
Function2Caller &operator<<( Function2Caller &obj, int x ) {
cout << "Streaming " << x << endl;
return obj;
}
Function2Caller function1( int i, int j ) {
cout << "function1 called with " << i << " and " << j << endl;
return Function2Caller( i, j );
}
int main() {
function1( 2, 3 ) << 4 << 6;
}
Эта программа печатает
function1 called with 2 and 3
Streaming 4
Streaming 6
function2 called with 2 and 3
Идея состоит в том, что в конце вашей строки объект Function2Caller
выходит из области видимости, и деструктор затем выполняет свою работу.
Обратите внимание, что при реализации этого вы, вероятно, должны запретить копированиеобъектов Function2Caller и делают function1
единственным, кто может вызвать конструктор Function2Caller
.