简体   繁体   English

SFINAE:无法重新声明班级成员

[英]SFINAE : class member cannot be redeclared

I am trying to create my own "smart iterator" and I'd like to use SFINAE to have some operators depending on the tag of the iterator : 我正在尝试创建自己的“智能迭代器”,并且我想使用SFINAE来根据迭代器的标签添加一些运算符:

Here is my code : 这是我的代码:

template<class Iterator, class Predicat, class Tag>
class RangeFilterIterator {
public:
    RangeFilterIterator(Iterator begin, Iterator end, Predicat predicat) :
        mBegin(begin), mEnd(end), mPredicat(predicat) {}

    bool operator !=(RangeFilterIterator const &r) {
        return mBegin != r.mBegin;
    }

    typename Iterator::value_type &operator*() {return *mBegin;}

    RangeFilterIterator &operator++() {
        while(mBegin != mEnd && mPredicat(*mBegin++));
        return *this;
    }

    template<class = std::enable_if_t<std::is_base_of<std::random_access_iterator_tag, Tag>::value>>
    RangeFilterIterator &operator+(std::size_t n) {
        while(n--)
            ++(*this);
        return *this;
    }

    template<class = std::enable_if_t<!std::is_base_of<std::random_access_iterator_tag, Tag>::value>>
    RangeFilterIterator &operator+(std::size_t n) = delete;

private:
    Iterator mBegin, mEnd;
    Predicat mPredicat;
};

template<typename Container, typename Predicate>
auto RangeFilter(Container const &c, Predicate p) {
    using Iterator = RangeFilterIterator<typename Container::iterator,
                                         Predicate,
                                         typename Container::iterator::iterator_category>;
    Iterator begin(const_cast<Container&>(c).begin(), const_cast<Container&>(c).end(), p);
    Iterator end(const_cast<Container&>(c).end(), const_cast<Container&>(c).end(), p);
    return Range(begin, end);
}

and at the line RangeFilterIterator &operator+(std::size_t n) = delete I got the error : class member cannot be redeclared . 并在RangeFilterIterator &operator+(std::size_t n) = delete我得到了错误: class member cannot be redeclared

I am not "good" with template, but I thought that with SFINAE only one of the two will be "declared". 我对模板不是“好”,但是我认为使用SFINAE只能“声明”这两个中的一个。 Am I missing something? 我想念什么吗? It is possible to do otherwise? 可以这样做吗?

Okay when I am using return type parameter instead of template parameter, it works. 好的,当我使用返回类型参数而不是模板参数时,它可以工作。

template<class tag = Tag>
std::enable_if_t<std::is_base_of<std::random_access_iterator_tag, tag>::value, RangeFilterIterator>
&operator+(std::size_t n) {
    while(n--)
        ++(*this);
    return *this;
}

template<class tag = Tag>
std::enable_if_t<!std::is_base_of<std::random_access_iterator_tag, tag>::value, RangeFilterIterator>
&operator+(std::size_t n) = delete;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM