(プリアンブル:私は C++0x ゲームに遅れて従い、C++0x 標準からの概念の削除に関する最近の論争がきっかけで、それらについてもっと学ぶようになりました。私の質問はすべて完全に仮説 -- 概念が有効な C++ コードであるとしても、しばらくの間有効ではない限り -- 概念についてもっと学ぶことにまだ興味があります。特に、最近の決定の背後にあるメリットをより完全に理解するのにどのように役立つかを考えると、その後の論争)
C++0x (最近まで) が提案した概念に関する入門資料を読んだ後、いくつかの構文上の問題に頭を悩ませています。これ以上苦労することなく、ここに私の質問があります:
1) 特定の派生概念をサポートする型 (auto キーワードを介して暗黙的に、または concept_maps を介して明示的に) も、基本概念を個別にサポートする必要がありますか? 言い換えれば、概念を別の概念から導出する行為 (例: concept B<typename T> : A<T>
) には、(B, 内に) '見えない' 要求ステートメントが暗黙的に含まれていrequires A<T>;
ますか? 混乱は、概念に関するウィキペディアのページに次のように記載されていることから生じます。
クラス継承と同様に、派生概念の要件を満たす型は、基本概念の要件も満たします。
つまり、型は派生概念の要件を満たす必要があるだけであり、必ずしも基本概念の要件を満たす必要はないと言っているように思えますが、これは私には意味がありません。ウィキペディアが決定的な情報源ではないことは理解しています。上記の説明は言葉の選択が悪いだけですか?
2) タイプ名をリストする概念は「自動」にすることができますか? もしそうなら、コンパイラはこれらの型名をどのように自動的にマップしますか? そうでない場合、概念で「自動」を使用することが無効になる他の機会はありますか?
明確にするために、次の架空のコードを検討してください。
template<typename Type>
class Dummy {};
class Dummy2 { public: typedef int Type; };
auto concept SomeType<typename T>
{
typename Type;
}
template<typename T> requires SomeType<T>
void function(T t)
{}
int main()
{
function(Dummy<int>()); //would this match SomeType?
function(Dummy2()); //how about this?
return 0;
}
これらのクラスのいずれかが SomeType と一致しますか? それとも、型名を含む概念に concept_map が必要ですか?
3) 最後に、どの公理が定義できるのか理解に苦しむ。たとえば、次のような論理的に矛盾する公理を概念に定義させることはできますか?
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
それは何をしますか?それも有効ですか?
これは非常に長い一連の質問であることを理解しています。事前に感謝します。