#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <iterator>

typedef char uint8;
typedef short uint16;

using namespace std;

class Test {

public:
    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) {
        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
}