Класс моделирует концепцию? (понятие-черта или наоборот)
Видимо, я упускаю что-то очевидное, скорее всего, из-за 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 или что-то еще".