翻譯
大一英文下學期,每個人都要上台 5 分鐘 "show & tell"。翻出當年的投影片,我秀了一段 C++ code,顯然是嚇人用的:
#ifndef GETSET_HPP #define GETSET_HPP template<typename T, typename C, T C::* P> struct Selector { // used for selecting which field to access static T C::* const MP; typedef T Type; }; template<typename T, typename C, T C::* P> T C::* const Selector<T, C, P>::MP = P; template<typename Derived> // Curiously Recurring Template Pattern class GetSet { // ref. <<C++ Templates: the Complete Guide>>, // <<C++ Template Metaprogramming>> public: template<typename S> const typename S::Type& get() const { return static_cast<const Derived* const>(this)->*S::MP; } template<typename S> void set(const typename S::Type& value){ static_cast<Derived* const>(this)->*S::MP = value; } }; // make defining selectors easier #define GENERATE_SELECTOR(C,T,P,N) typedef Selector< T , C , & C :: P > N #endif有人要幫我翻譯一下嗎?XD
--
好想畢業,想到睡不著…
Labels: 雜記
唔,現在看 CRTP 有種 recursive inductive definition 的味道 XD
你中毒了… XD
有點Modern C++ Design的味道..
我只會翻 // 右邊的部份.. XD
太久沒寫了,試了一下 @@
http://gist.github.com/130125
看起來是自動生 typical 的 getter/setter,
不過這使得 data member 需要是 public,
感覺好像失去滿大的意義 @@
當年我也一直想用 template 玩一些花招,
不過最後總覺得還是用外部程式去生比較實際點 @@
用 template 生出來的往往有很多缺點... :(
例如 getter/setter 用 ruby 去生,寫成這樣:
[%= accessor :'std::tr1::function[void(int,int)]', :hit_event %]
大概是這個檔的最下面:
http://github.com/godfat/cubeat/blob/master/cubeat-core/include/model/Cube.hpp.eruby
這大概是一年前寫的吧,產生的程式在這:
http://github.com/godfat/ludy/blob/master/lib/ludy/tasks/preprocess_cpp/attr_builder.rb
其實說穿了也沒什麼... @@
欸,其實也可以存取 private data members 啦,只是 GENERATE_SELECTOR 要放在 class 的 public section,或許 class 外面再加個 typedef 讓存取更方便一點。
…唔,所以這東西不但不怎麼實用,也沒有寫得很安全。顯然是我當年的小練習而已 XD。
喔對,我沒想到 XD
話說 template 真奇怪有神秘的魅力啊?
也試寫過相當多奇怪的東西,現在想得起來的有一個是自動產生 clone method,
甚至還去 comp.lang.c++.moderated 問過
不過最後結果是失敗 XD
不知道現在有沒有辦法變出來...
或許是因為 templates 本來不是設計來做這種事,所以真的辦到的話特別有成就感吧,和用 TeX 寫 ICFP programming contest 的題目感覺差不多 XD。
我覺得以前用來 "hack" templates 的精力現在應該拿來 "hack" dependent types XD。C++ 要方便生東西的話,還是做個 Meta C++ 吧 XD。
<< 回到主頁