Skip to content

C++ で Go言語の defer チックなものを簡素に実装

License

Notifications You must be signed in to change notification settings

hymkor/study-cpp-defer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple defer for C++ like golang by destructor

main.cpp

#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;
}

Output

main code
defer code(2)
defer code(1)
defer code(0)

defer.h

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 にしなくても、Tstd::function<void(void)> とすれば基本等価だが、そうすると g++ では

deferClass end = [](){ /* code */ };

という書き方がエラーになり

deferClass end([](){ /* code */ });

と書かなくてはいけなくなる。 ( 昔 VC++ で std::function で書いたときは大丈夫だった )

だが、template はどうせ functional の中で使われているし、この仕組み自体はどっちにしてもヘッダファイルの中に書かねばならないので、結果的に #include を減らせるこちらの方がよさそうだ。

References

標準 C++ でも検討されていたが、まだ正式に入っていない模様1

C++ ではなく、C言語(C23) の方に先に defer が入るかもしれない

Footnotes

  1. https://twitter.com/shirouzu/status/1483072158758621187

About

C++ で Go言語の defer チックなものを簡素に実装

Topics

Resources

License

Stars

Watchers

Forks