テンプレート パラメーターの要件を指定する方法であるC++ の概念について質問しています。これらは C++11 の作業中に提案されましたが、複雑すぎて間に合わなかったことが判明しました。しかし、それらは遅れただけで、忘れられたわけではありません。
それまでの間、ダック タイピングは引き続き非常に強力であり、必要なインターフェイスを持たないテンプレート パラメーターを渡すとキャッチされます。問題がきちんと報告されないだけです。
回避策として、示した制約を確認する簡単な方法は、アップキャスト時にのみポインター変換が暗黙的であるという事実を利用します。
public class Test<T> where T : BaseClass
{
static T* enforcement_helper = 0;
static BaseClass* enforce_inheritance_constraint = enforcement_helper;
};
コンパイラの新しさによっては、これらの行を特別なメンバー関数内に配置する必要がある場合があります (デストラクタは、ほとんど常に処理されるため、適切です)。
ただし、エラー メッセージを改善するためにのみ制約を確認する必要があります (コードの明確にコメントされたセクションでエラーを引き起こすことにより)。C++ テンプレートはダック タイプであり、必要な操作を提供する任意のテンプレート パラメーターで動作します。正式な「インターフェース」は必要ありません。