従って、9行目のdecltype(check(mClass))は、前者ならstd::false_type、後者ならstd::true_typeです。std::false_type::value、std::true_type::valueのどちらかをhas_var<クラス>::valueへ設定しています。check()の中身はなくてよい!?9行目でcheck()関数を呼び出しているように見えますね。本当に呼び出した場合、中身が無いとエラーになります。実際に呼び出さなければ中身がなくてもエラーになりません。この9行目のcheck()関数呼び出しはdecltype()で囲われています。decltype()は戻り値の型を返しますから、check()の実際の戻り値はなんでもよくて、戻り値の型さえ分かればコンパイルできます。上記のようにどちらのcheck()が呼ばれるのかが判定できれば、check()の戻り値の型も分かります。従って、check()関数自体は呼び出されることはないので中身を定義する必要はありません。テンプレート・メタ・プログラミングでは時々見かけるテクニックです。3-4.流れのまとめ長いですね。纏めると次のようになります。has_member.cpp)Wandboxで確認する。4.まとめ本格的なテンプレート・メタ・プログラミングっぽくなってきました。私が解説できるレベルですので難易度は低い方ですが、なかなかハードと思います。テンプレート・メタ・プログラミングで一番困るのはデバッグです。普通のプログラミングの場合、ともかくコンパイルに通して実行しつつバグを探します。実行しながらですので、シーケンシャルな実行をデバッガを使ったり、ログを取ったりしながら追いかけることができます。テンプレート・メタ・プログラミングの場合、コンパイルに通ればtypeid().name()を使ってどんな型へ展開されているのか見ることができますが、なかなかコンパイルに通らないです。0~#endifで括りつつ、端から順番にコンパイルに通しつつ、typeid().name()を使ってデバッグを進めることも多いです。TYPENAMEマクロが手放せません。頭が痛いのがエラー・メッセージの長さです。今回はクラスが1つしかないし、STLをほぼ使っていないのでエラーメッセージは短いのですが、ちょっと複雑なテンプレートを作ると長いです。使うstd::stringは実はテンプレートのtypedefです。allocator<char>&)です。これにマッチする物がないみたいなエラーが出ると本当長いです。エラー・メッセージをコピペしてエディタに貼り付け、区切り毎に改行とインデントを付けて読んでます。本当に苦労しますが、うまく行った時の快感は格別です。次回はdecltypeとstd::declvalについて解説したいと思います。decltypeは既にちょこまか出てきてますが、これはC++11の結構大きな立役者の1つと感じます。その辺りを絡めて解説したいと思います。Idiomというメタ関数の実装テクニックがあります。メンバ関数を書くのはもはや時代遅れのようです。汎用的なHAS_XXXマクロを書くことができます。マクロがコンパイル時計算可能な式に置き換わります。メンバ型名を調べるマクロを書いてみました。12:00いなむのみたまさん、コメントありがとうございます。TMPは先人が作ったパターンを利用しないとなかなか自力で1から作るのは難しいので、これは良いものですね。void_tはやっと標準規格に採用されたのですね。https://qiita.com/hidachinoiro/items/b866966eef77ac84f8f2std::enable_ifで十分だから入らなかったのかなと思ってました。有った方がよいのですよね。ところで、マクロと組み合わせたらHAS_MEMBER(クラス、メンバ名)が書けるのですね!!考えてみるとあり得る話です。気が付きませんでした。これは私ではとてもとても作れないです。下記がポイントですね。「インライン」で定義している。2しかし、1は呼び出さず、?:演算子の戻り値の型を決定するために使って、コンパイル時定数としている。この2つのテクニックを初めてみました。12:56あああ、少し判定対象を変えてみたらダメでした。現状では、「メンバ型」の有無判定しかできていないようです。https://wandbox.org/permlink/XjHDQXcyhRTMneU5あ、でも、下記でできました。https://wandbox.org/permlink/ify3yRafwfWLOBDV更に合体したら、型、関数、変数の全てに対応できました。コメントをキャンセルメールアドレスが公開されることはありません。テクノロジーの登録商標です。technology.。