我想维护一个基于范围和类型的方法,以便在我的班级中插入。
问题是如何使用迭代器实现这种类型依赖。
以下伪代码应该解释我的问题:
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
}
电贺。
答案 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)
...