#include <iostream>
#include "defer.h"
int main(){
deferClass end = [](){ std::cout << "defer code(0)" << std::endl; };
defer [](){ std::cout << "defer code(1)" << std::endl; };
defer [](){ std::cout << "defer code(2)" << std::endl; };
std::cout << "main code" << std::endl;
return 0;
}
main code
defer code(2)
defer code(1)
defer code(0)
template <typename T>
class deferClass {
const T f;
public:
deferClass(const T &f_) : f(f_){}
~deferClass(){ f(); }
};
#define CONCATINATE_IMPLEMENT(x,y) x ## y
#define CONCATINATE(x,y) CONCATINATE_IMPLEMENT(x,y)
#define defer deferClass CONCATINATE(defer,__LINE__)=
template にしなくても、T
を std::function<void(void)>
とすれば基本等価だが、そうすると g++ では
deferClass end = [](){ /* code */ };
という書き方がエラーになり
deferClass end([](){ /* code */ });
と書かなくてはいけなくなる。 ( 昔 VC++ で std::function で書いたときは大丈夫だった )
だが、template はどうせ functional
の中で使われているし、この仕組み自体はどっちにしてもヘッダファイルの中に書かねばならないので、結果的に #include を減らせるこちらの方がよさそうだ。
標準 C++ でも検討されていたが、まだ正式に入っていない模様1
C++ ではなく、C言語(C23) の方に先に defer が入るかもしれない