对不起,标题很长......请让我知道如何让它更好......
我有一个模板类:
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
具有兼容的数据类型作为向量?
修改
是否有编译时解决方案?
答案 0 :(得分:3)
您可以执行以下操作:
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");
}
答案 1 :(得分:1)
您可以这样做以确保Iterator指向的数据类型为T:
template <typename T>
class Example
{
public:
void add(const T* begin, const T* end)
{
}
};
向量构造函数不确保InputIterator具有兼容的数据类型作为向量。它只是分配内存并分配元素。因此,如果InputIterator指向的数据类型可以隐式转换为向量类型,则它会成功编译,不保证正确的分配行为。否则报告errors.eg:
char a[3] = {1, 2, 3};
vector<int> ivec(a, a + 2);
这可以顺利完成。
string str[3] = {"a", "b", "c"};
vector<int> ivec(str, str + 2);
这不是。