C++における汎用プログラミングにおいて「ある型に対して特定の構文がコンパイルされるかどうか」をチェックしたいという要求がありました.何故このようなことが必要かは
http://www.boost.org/libs/concept_check/concept_check.htm#motivating-example
http://boost.cppll.jp/HEAD/libs/concept_check/concept_check.htm#motivating-example
を読んでいただけると分かると思います.
で,通常ある構文がコンパイルされるかどうかをチェックするには当然その構文を書いてコンパイルすれば良いわけですが,ここでの要求はコンパイルされるかどうか「だけ」をチェックしたいというもので,実際に目的とする構文を実行するオーバーヘッドと実際にコードが実行されることによって生じるプログラム上の効果は排除しなければなりません.そこで目をつけられたのが関数テンプレートへのポインタでした.
id:Cryolite:20040820#p2で見たように関数テンプレートへのポインタは関数の呼び出しを行うことなく関数テンプレートの実体化を行うという著しい特徴を持っています.そのため,関数テンプレートの実体化に伴う構文チェックをコンパイラに行わせつつ,実体化されたコードを実際に実行することはないという芸当が可能になります.これを利用したのがBoost Concept Check Library(BCCL)です.その実装の詳細な説明は
http://www.boost.org/libs/concept_check/implementation.htm
http://boost.cppll.jp/HEAD/libs/concept_check/implementation.htm
で,読むことが出来ます.
以下は関数ポインタのキャストによるコンセプトチェックの例.
// 2項演算の+が型Tに対して定義されているか? template<class T> void addability_check(T) { T a; T b; a + b; } struct X { }; static_cast<void (*)(int)>(&addability_check); // OK static_cast<void (*)(X)>(&addability_check); // コンパイルエラー:Xには+が定義されていない