template styleに固有のコンパイル時のダックタイピングを使用する場合、テンプレート引数が特定のシグネチャを持つ特定のメソッドを実装するという要件を強制する方法はありますか?もちろんC++テンプレートで正式なプロトコルを実行するにはどうすればよいですか?
struct ProtocolT {
void g() const;
void h();
}
// I want the compiler to check that T conforms to ProtocolT
// that is, T must implement g() and h() rather than just g()
template <typename T>
void f(const T& x) {
x.g();
}
、これさえなくて、完璧な型の安全性があります:テンプレート引数T
は、テンプレート関数の実装で使用される方法を持っていない場合、コンパイラは常に文句を言うでしょう。
しかし、class T
には、class ProtocolT
に指定されているすべてのメソッドが必要であることが明確に示されています。私がまだテンプレート関数の実装で使用していないメソッドをT
から要求することで、開発プロセスの初期段階で設計を制約することができます。
ProtocolT
に未使用のメソッドが含まれていなくても、T
として使用可能なクラスを作成する必要があるときには、検証済みのプロトコル準拠が役立つと思います。 (もちろん、誰も文書化のためProtocolT
を書いてから私を停止していないが、その後、コンパイラはProtocolT
が少なくとも必要なすべてのメソッドが含まれていることを検証しません。)
継承を「T」を出す。 –
[static-polymorphism-make-sense-for-implement-an-interface]に関連する(https://stackoverflow.com/questions/20771210/does-static-polymorphism-make-sense-for-implementing-an) -interface) – Jarod42