注: 以下はすべて、GCC 6.1 のコンセプト TS 実装を使用しています。
Surface
次のようなコンセプトがあるとしましょう。
template <typename T>
concept bool Surface() {
return requires(T& t, point2f p, float radius) {
{ t.move_to(p) };
{ t.line_to(p) };
{ t.arc(p, radius) };
// etc...
};
}
Drawable
ここで、メンバー関数を持つ任意の型に一致する別の概念 を定義したいと思います。
template <typename S>
requires Surface<S>()
void draw(S& surface) const;
すなわち
struct triangle {
void draw(Surface& surface) const;
};
static_assert(Drawable<triangle>(), ""); // Should pass
つまり、 aは、要件を満たす何かへの左辺値参照を取るDrawable
テンプレート化された const メンバー関数を持つものです。これは言葉で指定するのはかなり簡単ですが、Concepts TS を使用して C++ でそれを行う方法を完全に理解することはできません。「明らかな」構文は機能しません。draw()
Surface
template <typename T>
concept bool Drawable() {
return requires(const T& t, Surface& surface) {
{ t.draw(surface) } -> void;
};
}
エラー: 'auto' パラメータはこのコンテキストでは許可されていません
2 番目のテンプレート パラメーターを追加すると、コンセプトの定義をコンパイルできますが、次のようになります。
template <typename T, Surface S>
concept bool Drawable() {
return requires(const T& t, S& s) {
{ t.draw(s) };
};
}
static_assert(Drawable<triangle>(), "");
テンプレート引数の推測/置換に失敗しました: テンプレート パラメーター 'S' を推測できませんでした
現在、特定の < Drawable
, Surface
>ペアDrawable
が概念に一致するかどうかのみを確認できますが、これは正しくありません。(型には、必要なメンバー関数があるか、ないかのいずれかです。それは、どの特定の項目をチェックするかD
に依存しません。)Surface
私が求めていることは可能だと確信していますが、構文を理解することはできず、オンラインにはまだあまり多くの例がありません. 型が制約されたテンプレート メンバー関数を持つ必要がある概念定義を記述する方法を知っている人はいますか?