ログ解析者がC++テンプレートプログラミングのポリシーをかじった結果。。。

C++テンプレートテクニックに、ポリシーというものがある。

ポリシーとは、クラス内の処理（関数）で、切り替え可能なものをいう。

https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design

The central idiom in policy-based design is a class template (called the host class), taking several type parameters as input, which are instantiated with types selected by the user (called policy classes), each implementing a particular implicit interface (called a policy), and encapsulating some orthogonal (or mostly orthogonal) aspect of the behavior of the instantiated host class.

よくわからない。。(*´Д｀)

プログラムの処理を言葉で説明するのは難しい。いろいろなところがつながっている（密結合な）ものならなおさらである。
(20万行のアセンブラを文章で説明しろと言われて、できるだろうか？）

その場合、文章（書籍やWEBページ）を何度見ても埒があかない場合もあるだらう。。(*´Д｀)

コードを見てみる。。。

     1#include <iostream>
     2#include <string>
     3
     4using namespace std;
     5
     6struct debug_log {
     7  static void display(const std::string& value)
     8  {
     9    std::cout << value << std::endl;
    10  }
    11};
    12
    13struct release_log {
    14  static void display(const std::string&) {}
    15};
    16
    17template <class LogPolicy>
    18struct huga {
    19  void foo() const
    20  {
    21    LogPolicy::display("Error. Need Checking !!!");
    22  }
    23};
    24
    25int main()
    26{
    27  cout << "huga<release_log>().foo();" << endl;
    28  huga<release_log>().foo();
    29  cout << endl;
    30
    31  cout << "huga<debug_log>().foo();" << endl;
    32  huga<debug_log>().foo();
    33  cout << endl;
    34
    35}
https://github.com/RuoAndo/qiita/blob/master/policy1.cpp

25行目と26行目の< >中に、

+```c++
    28  huga<debug_log>().foo();
    32  huga<release_log>().foo();
+```

4行目と11行目のdebug_logとrelease_logが代入されていると読める。

+```c++
     6struct debug_log {
    13struct release_log {
+```

これにより処理が切り替わる。
実行してみる。。。

<pre>
$ g++ policy1.cpp 
$ ./a.out 
huga<release_log>().foo();

huga<debug_log>().foo();
Error. Need Checking !!!
</pre>

イメージ的には↓　である。 debug_logとrelease_logごとにstruct hugaを書かなくていい感じである。

![policy1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/a5006143-3e63-8505-0ebf-b8e74cd71cc1.png)

ポリシークラスのデフォルト設定というのもある。

+```c++
    17template <class LogPolicy = debug_log>
    18struct huga {
+```

↑　こうしておくと、

+```c++
    37  huga<>().foo();
+```

↑　< >の中を埋めなくてもよくなる。（debugな処理が呼び出される）

     1#include <iostream>
     2#include <string>
     3
     4using namespace std;
     5
     6struct debug_log {
     7  static void display(const std::string& value)
     8  {
     9    std::cout << "[debug log]" << value << std::endl;    10  }
    11};
    12
    13struct release_log {
    14  static void display(const std::string&) {}
    15};
    16
    17template <class LogPolicy = debug_log>
    18struct huga {
    19  void foo() const
    20  {
    21    LogPolicy::display("Fatal Error!!!");
    22  }
    23};
    24
    25int main()
    26{
    27
    28  std::cout << "huga<debug_log>().foo();" << endl;
    29  huga<debug_log>().foo();    30  cout << endl;
    31  
    32  cout << "huga<release_log>().foo();" << endl;
    33  huga<release_log>().foo();
    34  cout << endl;
    35  
    36  cout << "huga<>().foo();" << endl;
    37  huga<>().foo();
    38  cout << endl;
    39
    40  cout << "typedef huga<release_log> release_huga;" << endl;
    41  cout << "release_huga().foo();" << endl;
    42  typedef huga<release_log> release_huga;
    43  release_huga().foo();
    44  cout << endl;
    45
    46  cout << "typedef huga<debug_log> debug_huga;" << endl;
    47  cout << "debug_huga().foo();" << endl;
    48  typedef huga<debug_log> debug_huga;
    49  debug_huga().foo();    50  cout << endl;
    51} 
https://github.com/RuoAndo/qiita/blob/master/policy2.cpp

実行してみる。。。

<pre>
$ g++ policy2.cpp
$ ./a.out 
huga<debug_log>().foo();
[debug log]Fatal Error!!!

huga<release_log>().foo();

huga<>().foo();
[debug log]Fatal Error!!!

typedef huga<release_log> release_huga;
release_huga().foo();

typedef huga<debug_log> debug_huga;
debug_huga().foo();
[debug log]Fatal Error!!!
</pre>

このポリシーをベースにして、Boost.MultiIndexが実装されているようなのだが、今のところよくわからない。。(*´Д｀)