.木曜に bsdclub のルータの電源が壊れて夜中に復旧した。 .読書。 . . . |
.昨日。寝てた。 .今日。ドトールでマターリ。 .マイメロ。いろんな意味でひでえ(褒め言葉)。 .日常化するNHKの捏造棒グラフ - 細かいことを言えば、必ずしも 0 を原点にするのがフェアなわけではない。たとえば、円-ドルレートの時系列グラフを原点 0 円で書かれたら困る。そういう意味で、むしろ重要なのは値域と定義域なのだが(たとえばこれを見るべし)、いずれにしても機械的なルール化は難しい。 |
.C++ のテンプレートを使っていると、たまにギョッとする構文に出会う。たとえばこんなのはどうでしょう: template <class T> typename T::Type foo_proxy() { return T::template foo<typename T::Type>(); } .これはこういうふうに使う: なお、 int() は 0 を返します。 .C 言語の構文もそうなのだけれども、名前トークンが型名なのか何なのかが分からないとパースすらままならない。 C 言語でも C++ でも、以下のような文は A が型名かどうかで解釈が変化する: A *a;こういう事情によって C 言語は前方参照ができないので、関数呼び出しを除いて必ず宣言を必要とする。一方でテンプレートは決まった形をあらかじめ宣言しておくことができない上に、名前にはテンプレート名と非テンプレート名という区分もあって、これによってあとに続く不等号の解釈も変化するから、上みたいなこじれたことになる。なお、属性が分からない名前は「シンボル名」「非テンプレート名」として扱われるので、「型名」と「テンプレート名」として扱わせたい時には、上のように明示的に指定する必要がある。 .しかしもうちょっとなんとかならんもんか。根本的には C 言語の文法に全ての元凶があるんだけれども。 .もっとこじれた例: :: の左側はクラス名(または名前空間名)として解釈されるので、かろうじて get() 関数の呼び出しで「template typename」みたいな不格好な書き方は避けられている。なお、次のように書くだけで大分マシにはなる: template <class T> typename T::Type bar() { typedef typename T::Type Type; typedef typename T::template X<Type> X; X a = Type(); return X::get(a); }typedef の後の typename は一見冗長に見えて必須なのだけれども、多分関数型あたりとの兼ね合いによって、これは冗長ではないのだと思う。 .それにしても、 gcc-4 になってから C++ でコードを書くのに全く不安がなくなった。良いことだ。 |
.大変不幸なことに、また一つxxxxxが増えました。候補:
.読書。 . |