如何确保迭代器模板参数与模板类的模板参数具有相同的数据类型

时间:2014-08-21 01:25:07

标签: c++ templates stl iterator

对不起,标题很长......请让我知道如何让它更好......

我有一个模板类:

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具有兼容的数据类型作为向量?

修改

是否有编译时解决方案?

2 个答案:

答案 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);

这不是。