C++でクロージャや関数を返す関数を勉強していたときの痕跡

はじめに

こんにちは、野村です。

奇妙なものを掘り返しました。以前書いたc++のソースです。
最初これを見ても、何をするプログラムなのか見当がつきませんでした。

で、しばらく眺めているうちに「関数を返す関数」と「クロージャ」を同時に勉強していたときのものと判明したのですよ。
闇雲に書いていて錯綜してたことが伺えます。

せっかくなのでここに公開してみます。一種の供養です。

ソースコード

main.cpp

#include <iostream>
#include <vector>
#include <functional>
using namespace std;

vector<function<void()>> outer(){
  static int i=0;
  struct inner{
    static void show(){cout<<i<<endl;}
    static void increment(){++i;}
    static void reset(){i=0;}
  };
  return {
    [](){inner::show();},
    [](){inner::increment();},
    [](){inner::reset();}
  };
}

int main(void) {
  auto func = outer();
  for(auto i : {0,1,0,1,0,2,0}){
    func[i]();
  }
  return 0;
}

コンパイル

$ g++ main.cpp -std=c++14

実行結果

$ ./a.out
0
1
2
0

何をしたかったのか?

とてもじゃないけど僕には、クロージャを説明することができない。
関数内の変数の状態を閉じ込めておくテクニック、でいいのかな?違うのかも。

今回の場合、関数「outer」内の変数iの状態を保持してるわけです。
で、そのiの値をインクリメントする関数やリセットする関数を配列として関数「outer」の戻り値に設定してます。

しかし、当時の自分は何をしたかったのだろう?
クラスですべきことをクラスを使わずに遂行したかったとか?

最後に

以上、以前勉強していた痕跡を開帳してみました。

うまい説明を思いつき次第、このページを更新するつもりです。
このブログもネタが尽きて迷走する予感。

というわけで、今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。