16
クラスに特定のシグネチャのメンバー関数があるかどうかを確認する
私は、クラスが特定の署名の特定のメンバー関数を持っているかどうかを検出するためのテンプレートトリックを求めています。 問題はここで引用したものと似てい ます が、同じではありません。Sutterの本の項目で、クラスCがメンバー関数を提供する必要があるという質問に答えました特定の署名がないと、プログラムはコンパイルされません。私の問題では、クラスにその機能がある場合は何かをする必要があります。 同様の問題がboost :: serializationにも直面しましたが、私が彼らが採用した解決策は好きではありません。特定のメンバー関数を定義しない限り、デフォルトで特定のシグネチャを持つフリー関数(定義する必要がある)を呼び出すテンプレート関数(彼らの場合、特定のシグネチャを持つ特定のタイプの2つのパラメータをとる「シリアライズ」、それ以外の場合、コンパイルエラーが発生します。それは、侵入型と非侵入型の両方のシリアライゼーションを実装することです。 次の2つの理由で、このソリューションは好きではありません。 非侵入型にするには、boost :: serialization名前空間にあるグローバルな「serialize」関数をオーバーライドする必要があります。これにより、クライアントコードで名前空間のブーストと名前空間のシリアル化を開くことができます。 この混乱を解決するためのスタックは、10〜12の関数呼び出しでした。 そのメンバー関数を持たないクラスのカスタム動作を定義する必要があり、エンティティは異なる名前空間内にあります(ある名前空間で定義されているグローバル関数を別の名前空間にある間にオーバーライドしたくない) このパズルを解くためのヒントを教えてもらえますか?