基于类型的基于范围的插入器功能

时间:2014-03-05 17:59:09

标签: c++ iterator

我想维护一个基于范围和类型的方法,以便在我的班级中插入。

问题是如何使用迭代器实现这种类型依赖。

以下伪代码应该解释我的问题:

class Test {

public:
    template<typename Iterator>
    void insert(const uint8 position, const Iterator begin, const Iterator end) {
        std::copy(begin, end, std::inserter(m_deque, m_deque.begin());
    }


private:
    std::deque<uint8> m_deque;

};


int main() {

    Test t;

    uint8 dataone[] = {0x00, 0xff};
    uint16 datatwo[] = {0xff, 0x00};
    std::vector<uint8> vecdataone = {0x00, 0xff};
    std::vector<uint16> vecdatatwo = {0xff, 0x00};

    t.insert(0, dataone, dataone + 2); // OKAY
    t.insert(0, datatwo, datatwo + 2); // SHOULD CAUSE AN ERROR
    t.insert(0, vecdataone.cbegin(), vecdataone.cend()); // OKAY
    t.insert(0, vecdatatwo.cbegin(), vecdatatwo.cend()); // SHOULD CAUSE AN ERROR

}

电贺。

2 个答案:

答案 0 :(得分:3)

静态断言将完成这项工作:

void insert(const uint8 position, const Iterator begin, const Iterator end)
{
    static_assert(
        std::is_same<
            typename std::iterator_traits<Iterator>::value_type,
            uint8_t
        >::value,
        "Need iterators to uint8_t!"
    );
    // ....
}

我还建议使用deque自己的插入函数而不是std::copy

 m_deque.insert(s.deque.begin() + position, begin, end);

作为会员功能并因此意识到内部,它可以更好地优化插入。

答案 1 :(得分:1)

我喜欢(并且赞成)jrok的答案,但这是使用SFINAE的另一种方法,这意味着如果有意义的话,你可以允许匹配其他insert覆盖。错误消息可能比jrok的答案更加神秘。

template<typename Iterator>
typename std::enable_if<
             std::is_same<typename std::iterator_traits<Iterator>::value_type,
                          uint8>::value,
             void>::type 
insert(const uint8 position, const Iterator begin, const Iterator end)
    ...

演示http://ideone.com/c1d9jT