班级模型是一个概念吗? (概念到特征,反之亦然)

时间:2013-12-08 03:37:31

标签: c++ traits c++-concepts

显然我错过了一些明显的东西,最有可能是SFINAE - 但对于我的生活,我只是找不到“它”是什么。 可以责备我的智慧牙齿,但这听起来很奇怪,因为它是关于智慧的......

在C ++中使用Concepts(Boost,Lite或其他)时,可以使用REQUIRES(list_of_concepts)之类的东西来强制执行,例如:函数调用中的类型遵循像“BidirectionalIteratorAccess”这样的概念。但是这个功能的相应“查询”组件是什么?基本上,我如何询问是否类型T模型BidirectionalIteratorAccess

我所知道的是,我不是在寻找REQUIRESBOOST_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);
};

......无论如何,什么样的白痴将他们命名为智慧牙齿?为什么我要离题?

1 个答案:

答案 0 :(得分:0)

在Concepts Lite中,约束是constexpr bool模板函数,当且仅当模板参数为概念建模时才返回true。因此,只有BidirectionalIteratorAccess<T>()模型true才会T评估为BidirectionalIteratorAccess

我理解这个答案可能对你没用,但你确实说过“Boost,Lite或其他什么。”