hsimyu's diary

ゲームなどをします。

10/9 みかん 3.4 kg

10/8

天気が良かった。昼まで寝て、ご飯食べて、昼寝した。

ごはん

昼: サンドイッチ

夜: ナポリタン的なもの

Rust

Programming Rust を読み始めた。

  • ? で Result<T, E>を展開するのは便利。なにかエラーが起きたら、それがそのまま関数の返り値になる ⇒ Result を返す関数内でだけ使える?main 関数は返り値がないので、main 内では使えない。初心者がよくやるミス
  • Result<T> = std::result::Result<T, Error>は構文糖的に std::io モジュール内でj定義されてる。

その他

PowerShell で time コマンド的なことをやるなら Measure-Command コマンドレット

    > measure-command { command }

10/9

ごはん

朝: オールブラン

昼: お弁当(オムレツ、ウィンナーとか)

夜: 焼き魚

仕事

先週末に書いた議事録の清書とか、先週入れたデカいPRの細かい調整とか。割りと進んだ感があった。やはり見た目が良くなると満足感が出る。仕事が増えたので明日はそちらを優先で潰す。

物性理論大学院生の日常〜研究室は解散しました

面白かった。おすすめです。

物性理論大学院生の日常〜研究室は解散しました(新井パグナス) - カクヨム

std::decay

decay - cpprefjp C++日本語リファレンス

配列と関数ポインタに関して、関数テンプレートと同様に推論された型を取得する。

???

コードを見たらなんとなく分かった。クラステンプレートに参照渡しできない?配列と関数ポインタに関して、関数テンプレートの規則に従って推論された型を取得するために使う?

    #include <type_traits>
    
    template <class T1, class T2>
    struct my_pair {
      T1 first;
      T2 second;
    
      template <class U1, class U2>
      my_pair(const U1& a, const U2& b)
        : first(a), second(b) {}
    };
    
    template <class T1, class T2>
    my_pair<T1, T2> my_bad_make_pair(const T1& a, const T2& b)
    {
      return my_pair<T1, T2>(a, b);
    }

こんなテンプレートがあるときに、

    auto p = my_bad_make_pair("hello", "world");
    // => コンパイルエラー: 配列をコンストラクタの初期化子で初期化できない

これはコンパイルが通らない。なぜなら、この場合 T1, T2 は const char* ではなくて const char[6] として推論されていて、U1, U2const char[6]& と推論されている?(この辺合ってなさそう)

これを関数テンプレートの規則に従って const char* と推論されるようにしたい。このような時に std::decay が使える。

    template <class T1, class T2>
    my_pair<
      typename std::decay<const T1>::type,
      typename std::decay<const T2>::type
    >
      my_make_pair(const T1& a, const T2& b)
    {
      return my_pair<
               typename std::decay<const T1>::type,
               typename std::decay<const T2>::type
              >(a, b);
    }

std::decay は以下のことをする。

  1. 参照外し
  2. 配列型なら、ポインタに変換
  3. 関数型なら、関数ポインタに変換
  4. そうでないなら、const, volatile 外し

こうやってクラステンプレートに渡す型を std::decay を通せば、コンパイルできる。

    // OK
    // decltype(q) == my_pair<const char*, const char*>
    auto q = my_make_pair("hello", "world");

参考:

なんか理解しきれてないので、もうちょっと調べよう。

その他

Marble It Up!: 面白そう

jp.ign.com