Видимо, я упускаю что-то очевидное, скорее всего, из-за СФИНАЕ, но я просто не могу понять, что это такое. я мог вините мой зуб мудрости, но это звучит странно, потому что речь идет о мудрости …
В C ++ при использовании Concepts (Boost, Lite или чего-либо еще) используется что-то вроде REQUIRES(list_of_concepts)
чтобы обеспечить это, например: тип в вызове функции следует концепции, как «BidirectionalIteratorAccess
«. Но каков соответствующий компонент» запрос «для этой функции? По сути, как я могу просить если модели класса T модели BidirectionalIteratorAccess
?
Все, что я знаю, это то, что я не ищу REQUIRES
или же BOOST_CONCEPT_ASSERT
так как они имеют значение true-or-compilation-error; Я ищу что-то, что правда или ложь, как 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);
};
… какой идиот назвал их мудрость зубы в любом случае? И почему я отвлекся?
В Concepts Lite ограничение является constexpr bool
функция шаблона, которая возвращает истину тогда и только тогда, когда параметры шаблона моделируют концепцию. Так BidirectionalIteratorAccess<T>()
оценил бы true
если и только T
модели BidirectionalIteratorAccess
,
Я понимаю, что этот ответ, вероятно, бесполезен для вас, но вы сказали «Boost, Lite или что-то еще».
Других решений пока нет …