0

显然我遗漏了一些明显的东西,很可能是 SFINAE - 但对于我的生活,我就是找不到“它”是什么。可以责怪我的智齿,但这听起来很奇怪,因为它是关于智慧的……

在 C++ 中,当使用概念(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);
};

......到底什么样的白痴将它们命名为智齿?为什么我跑题了?

4

1 回答 1

0

在 Concepts Lite 中,约束是一个constexpr bool模板函数,当且仅当模板参数对概念建模时才返回 true。所以BidirectionalIteratorAccess<T>()会评估trueif 且 only Tmodels BidirectionalIteratorAccess

我知道这个答案可能对您没有用,但您确实说过“Boost、Lite 或其他”。

于 2014-01-06T19:07:07.443 回答