显然我错过了一些明显的东西,最有可能是SFINAE - 但对于我的生活,我只是找不到“它”是什么。 我可以责备我的智慧牙齿,但这听起来很奇怪,因为它是关于智慧的......
在C ++中使用Concepts(Boost,Lite或其他)时,可以使用REQUIRES(list_of_concepts)
之类的东西来强制执行,例如:函数调用中的类型遵循像“BidirectionalIteratorAccess
”这样的概念。但是这个功能的相应“查询”组件是什么?基本上,我如何询问是否类型T模型BidirectionalIteratorAccess
?
我所知道的是,我不是在寻找REQUIRES
或BOOST_CONCEPT_ASSERT
因为它们是真或编译错误;我正在寻找像type_traits
这样的真或假的东西。 Boost.Concept Assert和其他人的文档表明,人们会使用类似not_satisfied<Concept>
的SFINAE检查,但如果是这样,我出于某种原因无法确定哪个部分在哪里。我只能猜测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);
};
......无论如何,什么样的白痴将他们命名为智慧牙齿?为什么我要离题?
答案 0 :(得分:0)
在Concepts Lite中,约束是constexpr bool
模板函数,当且仅当模板参数为概念建模时才返回true。因此,只有BidirectionalIteratorAccess<T>()
模型true
才会T
评估为BidirectionalIteratorAccess
。
我理解这个答案可能对你没用,但你确实说过“Boost,Lite或其他什么。”