2009/06/12

翻譯

大一英文下學期,每個人都要上台 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:

Blogger XOO6/13/2009 9:16 am 說:

唔,現在看 CRTP 有種 recursive inductive definition 的味道 XD

 
Blogger Josh Ko6/13/2009 9:19 am 說:

你中毒了… XD

 
Blogger bill_lin6/14/2009 5:59 pm 說:

有點Modern C++ Design的味道..

 
Anonymous scm6/15/2009 7:51 am 說:

我只會翻 // 右邊的部份.. XD

 
Blogger godfat 真常6/15/2009 3:21 pm 說:

太久沒寫了,試了一下 @@
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

其實說穿了也沒什麼... @@

 
Blogger Josh Ko6/15/2009 3:36 pm 說:

欸,其實也可以存取 private data members 啦,只是 GENERATE_SELECTOR 要放在 class 的 public section,或許 class 外面再加個 typedef 讓存取更方便一點。

…唔,所以這東西不但不怎麼實用,也沒有寫得很安全。顯然是我當年的小練習而已 XD。

 
Blogger godfat 真常6/16/2009 2:56 am 說:

喔對,我沒想到 XD

話說 template 真奇怪有神秘的魅力啊?
也試寫過相當多奇怪的東西,現在想得起來的有一個是自動產生 clone method,
甚至還去 comp.lang.c++.moderated 問過
不過最後結果是失敗 XD
不知道現在有沒有辦法變出來...

 
Blogger Josh Ko6/16/2009 3:31 am 說:

或許是因為 templates 本來不是設計來做這種事,所以真的辦到的話特別有成就感吧,和用 TeX 寫 ICFP programming contest 的題目感覺差不多 XD。

我覺得以前用來 "hack" templates 的精力現在應該拿來 "hack" dependent types XD。C++ 要方便生東西的話,還是做個 Meta C++ 吧 XD。

 

<< 回到主頁