1

我正在编写一个新容器,并试图遵守N3485 23.2.3 [sequence.reqmts]/14,其中指出:

对于本条和第 21 条中定义的每个序列容器:

  • 如果构造函数

    template <class InputIterator>
    X(InputIterator first, InputIterator last, 
         const allocator_type& alloc = allocator_type())
    

    使用不符合输入迭代器条件的类型调用InputIterator,则构造函数不应参与重载决议。

/14对于采用迭代器范围的成员函数几乎逐字重复)

N3485 23.2.3 [sequence.reqmts]/15说:

未指定实现确定类型不能作为输入迭代器的程度,但至少整数类型不应作为输入迭代器。

我的理解是“不应参与重载决议”这句话意味着容器实现者应该在模板参数推导期间使用 SFINAE 技巧来禁用该构​​造函数或成员函数。对于成员函数,这没什么大不了的;因为函数的返回类型是正常的使用方式enable_if。但是对于构造函数,没有enable_if可以应用的返回类型。这是我第一次尝试声明构造函数:

// The enable_if use below is to comply with 23.2.3 [sequence.reqmts]/14:
//     ... is called with a type InputIterator that does not qualify as an input iterator
//     then the constructor shall not participate in overload resolution.
template <typename InputIterator>
path(std::enable_if<!std::is_integral<InputIterator>::value, InputIterator>::type first,
     InputIterator last, Allocator const& allocator = allocator_type());

但是,boost 的enable_if文档建议使用初始化为的虚拟指针参数,nullptr而不是使用函数的实际参数。这是正确行为所必需的,还是前面path的迭代器范围构造函数声明可以?

4

1 回答 1

3

enable_ifThe Good Robot (R. Martinho Fernandes)在他的博客中用干净的 C++11 解决方案讨论了这个问题,即使用默认模板参数来应用。

但是,让我在这里指出,做

    template< class Type >
    void foo( typename Something< Type >::T )

挫败论据演绎

通过显式提供模板参数,仍然可以调用该函数。但是在 C++ 中,编译器将简单地拒绝将MyType实际参数与形式参数类型匹配Something<Blah>::T,因为虽然在某些特殊情况下可以做到这一点,但它并不总是可以做到(可能有无数种选择Blahwhere Something<Blah>::Tis MyType)。

所以,你目前的方法一般都行不通,但是规范要求的整个问题都是C++11的问题,所以C++11的具体解决方案就OK了!:-)

于 2012-12-09T22:30:03.437 回答