Класс моделирует концепцию? (понятие-черта или наоборот)

Видимо, я упускаю что-то очевидное, скорее всего, из-за SFINAE, но я просто не могу понять, что это такое. Я мог бы обвинить мой зуб мудрости, но это звучало бы странно, потому что речь идет о мудрости...

В C++ при использовании Concepts (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);
};

... Что за идиот назвал их зубами мудрости? И почему я отвлекся?

1 ответ

В Concepts Lite ограничение является constexpr bool функция шаблона, которая возвращает истину тогда и только тогда, когда параметры шаблона моделируют концепцию. Так BidirectionalIteratorAccess<T>() оценил бы true если и только T модели BidirectionalIteratorAccess,

Я понимаю, что этот ответ, вероятно, бесполезен для вас, но вы сказали "Boost, Lite или что-то еще".

Другие вопросы по тегам