0

どうやら私は明らかな何かを見逃しているようです.SFINAEで最も可能性が高いですが、私の人生では、「それ」が何であるかを見つけることができません. 親知らずのせいにすることもできますが、それは知恵に関するものなので奇妙に聞こえるでしょ...

C++ では、概念 (Boost、Lite など) を使用する場合REQUIRES(list_of_concepts)、たとえば、関数呼び出しの型は " BidirectionalIteratorAccess" のような概念に従います。しかし、この機能に対応する「クエリ」コンポーネントは何ですか? 基本的に、クラス型 T がモデル化されているかどうかを確認するにはどうすればよいですBidirectionalIteratorAccessか?

私が知っているのは、私が探していない、REQUIRESまたはBOOST_CONCEPT_ASSERTそれらが真またはコンパイルエラーであるためです。のように、真か偽かの何かを探していますtype_traits。Boost.Concept Assert などのドキュメントでは、次のようなもので SFINAE チェックを使用することが示唆されていますnot_satisfied<Concept>が、そうであれば、何らかの理由でどの部分がどこにあるのかわかりません。SFINAE テストは次のようになると推測できます。

template <typename T> struct models_MyConcept {
    template <typename C>
    static yes_t test (some_sort_of_argument_using_MyConcept);
    template <typename C>
    static no_t test (...);
    static const bool value = sizeof(something_calling_test_with_a_C_argument_somehow) == sizeof(yes_t);
};

…いったい、どのような馬鹿が親知らずと名付けたのですか?そして、なぜ私は脱線したのですか?

4

1 に答える 1

0

Concepts Lite では、制約は、constexpr boolテンプレート パラメーターがコンセプトをモデル化する場合にのみ true を返すテンプレート関数です。したがって、 if and only modelsBidirectionalIteratorAccess<T>()に評価されます。trueTBidirectionalIteratorAccess

この回答が役に立たない可能性が高いことは理解していますが、「Boost、Lite、または何でも」と言っていました。

于 2014-01-06T19:07:07.443 に答える