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

问题描述 投票:0回答:3

抱歉标题太长...请让我知道如何让它变得更好...

我有一个模板类:

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

编辑:

有编译时解决方案吗?

c++ templates stl iterator
3个回答
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
投票

你可以这样做来确保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);

这不是。


0
投票

可以使用

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);
© www.soinside.com 2019 - 2024. All rights reserved.