抱歉标题太长...请让我知道如何让它变得更好...
我有一个模板类:
template <typename T>
class Example {
...
template <typename Iterator>
void add(const Iterator begin, const Iterator end);
...
};
如何确保
Iterator
指向的数据类型是T
?
另一个相关问题:
这个STL向量构造函数是如何实现的
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
确保
InputIterator
具有与向量兼容的数据类型?
编辑:
有编译时解决方案吗?
您可以执行以下操作:
template <typename Iterator>
void add(const Iterator begin, const Iterator end)
{
static_assert(std::is_same<typename std::iterator_traits<Iterator>::value_type,
T>::value, "Iterator must be the same as T");
}
你可以这样做来确保Iterator指向的数据类型是T:
template <typename T>
class Example
{
public:
void add(const T* begin, const T* end)
{
}
};
向量构造函数并不能确保InputIterator具有与向量兼容的数据类型。它只是分配内存并分配元素。因此,如果InputIterator指向的数据类型可以隐式转换为向量类型,则它会成功编译,但不会不能保证正确的赋值行为。否则会报告错误。例如:
char a[3] = {1, 2, 3};
vector<int> ivec(a, a + 2);
这样就可以成功编译了。
string str[3] = {"a", "b", "c"};
vector<int> ivec(str, str + 2);
这不是。
可以使用
std::enable_if
类型特征来约束函数。
示例:
template <typename InIter, typename = std::enable_if_t<std::is_same_v<T, typename std::iterator_traits<InIter>::value_type>>>
void add(InIter, InIter);