C++ 我的类型在std函数中的enable_if谓词失败。有没有一种方法可以;“调试”;谓词?

C++ 我的类型在std函数中的enable_if谓词失败。有没有一种方法可以;“调试”;谓词?,c++,iterator,enable-if,C++,Iterator,Enable If,我的问题一般是关于标准库中的enable\u if谓词,但我将在迭代器类型的上下文中对其进行框架化,因为这就是我目前遇到的问题 我有一个自定义迭代器类型It,这样std::iterator\u traits::value\u type就是Val。我已经在C++11之前的标准中成功地使用了这种类型,但是现在在C++11(以及在另一个更严格的编译器中)编译失败了。我拥有的一个用例是喜欢 查看标题,我看到如果谓词是\u是迭代器,则失败的启用\u。是否有一种方法可以一步一步地检查谓词条件,找出它未满足的

我的问题一般是关于标准库中的
enable\u if
谓词,但我将在迭代器类型的上下文中对其进行框架化,因为这就是我目前遇到的问题

我有一个自定义迭代器类型
It
,这样
std::iterator\u traits::value\u type
就是
Val
。我已经在C++11之前的标准中成功地使用了这种类型,但是现在在C++11(以及在另一个更严格的编译器中)编译失败了。我拥有的一个用例是喜欢

查看
标题,我看到如果
谓词是
\u是迭代器,则失败的
启用\u。是否有一种方法可以一步一步地检查谓词条件,找出它未满足的
,或者通常有任何方法可以在不需要逐个手动检查
InputIterator
(或任何相关概念)的所有要求的情况下找到此信息


< >旧编译器(<代码> IT <代码> >)是C++ + Builder XE8的代码> BC32 32/代码>;新编译器是C++中Builder 10.1中基于CLAN的32位编译器。

< P>编译器将试图告诉你哪个参数是错误的。VisualStudio将告诉您最符合您的规范的重载,以及哪些参数匹配或不匹配。我相信Clang和gcc也能做到这一点

一旦您读取了不匹配的参数,您就有责任确定编译器是否尝试了正确的重载,以及您的参数如何无法匹配

在大多数情况下,这是非常直截了当的。但对于迭代器来说,您是对的,这可能有点令人畏惧。但这就是为什么这通常由样板文件继承来处理的原因

在编写迭代器时,您的责任是实现继承自的迭代器类别的需求

要求最后两个参数为“”。因此,您应该继承了
迭代器
或更复杂的标记之一。“输入计算器”的定义如下:

  • 满足“”的所有要求的类型
  • 类型为“”
  • 定义了
    引用
    值类型
    成员类型
  • 定义了不等式算子
  • 定义了指针取消引用和成员选择运算符
  • 定义了增量前和增量后运算符

  • 也许能帮上忙,看起来不错。我会试试看。@alcedine在这样的网站上,逐个检查任何概念的要求都很容易。@Holt这并不难,这是因为可能有很多问题需要检查。恐怕这不是我所问问题的答案。@alcedine你没有通过
    vector
    enable\u if
    并且你想逐步了解“InputIterator”的要求,对吗?这些就是要求。或者我误解了你的要求吗?我的意思是像在调试器中单步执行代码一样单步执行它们,或者只是获取一些更具体的错误信息(如“
    It
    不满足C的条件X”,而不仅仅是“
    It
    不满足C”)——而不是从列表中手动检查它们。如果不清楚,请道歉。@alcedine我已经更新了我的答案。我肯定你不是在问第三方的建议(因为http://stackoverflow.com禁止这样的问题),所以你的官方答案是:“不,没有办法”,但大多数编译器在几乎所有方面都做得很好,但迭代器除外。对于迭代器,标准为您提供了大量帮助,您正在使用这些帮助吗?好的,您已经在这里扩展了重载解析,但这一点总是很清楚的。我知道我要查找的
    insert
    的哪个重载,并且我从编译器输出中知道编译器拒绝该重载候选项的原因(请参阅我发布的输出;如果
    enable\u
    ,则该候选项被禁用)。
    std::vector<Val> v; 
    It begin = ...
    It end = ...   
    v.insert(v.end(), begin, end);
    
    no matching member function for call to 'insert'
    candidate template ignored: disabled by 'enable_if' [with _Iter = It]