{"categories":["D\u8a00\u8a9e"],"type":"rich","provider_url":"https://hatena.blog","blog_title":"...ing logging 4.0","author_name":"haru-s","author_url":"https://blog.hatena.ne.jp/haru-s/","html":"<iframe src=\"https://hatenablog-parts.com/embed?url=https%3A%2F%2Fharu-s.hatenablog.com%2Fentry%2F20100110%2F1263092475\" title=\"Logger - ...ing logging 4.0\" class=\"embed-card embed-blogcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;\"></iframe>","width":"100%","blog_url":"https://haru-s.hatenablog.com/","description":"import std.stdio; class Logger(T) { T loggee; this() { loggee = new T; } this(T loggee) { this.loggee = loggee; } auto opDispatch(string name, U...)(U args) { writeln(\"call \" ~ name); mixin(\"return loggee.\" ~ name ~ \"(args);\"); } } class A { void func(){writeln(\"fire\");} } void main() { auto x = new\u2026","version":"1.0","url":"https://haru-s.hatenablog.com/entry/20100110/1263092475","image_url":null,"provider_name":"Hatena Blog","title":"Logger","height":"190","published":"2010-01-10 12:01:15"}