c++ - 将迭代器传递给类函数

标签 c++ stl

我正在尝试创建一个新的模板类“CrazyBucket< T >”,它必须包含多个 T 类型的值。

我想为此类创建一个构造函数,它可以接受任何 2 个前向迭代器作为其参数,并将这些值(T 类型)复制到类实例中。

构造函数:

CrazyBucket< T >::CrazyBucket( iterator< forward_iterator_tag, T > start,  iterator< forward_iterator_tag, T > end )
{ ... }

但是当我尝试调用它时,

vector< int > vec;
vec.push_back( 4 );
CrazyBucket< int > bucket( vec.begin(), vec.end() );

我得到以下错误,

candidate constructor not viable: no known conversion from 'iterator' (aka '__wrap_iter<pointer>') to 'std::iterator<std::forward_iterator_tag, int>' for 1st argument

非常感谢任何关于我应该如何定义我的构造函数的帮助。

提前致谢。

最佳答案

您可以使用 SFINAE 以我认为接近您想要的方式排除不匹配的类型。

#include <iostream>
#include <iterator>
#include <vector>

template<class T>
class CrazyBucket
{
public:
    template<class It, typename = typename std::enable_if<
        std::is_same< typename std::iterator_traits<It>::value_type,T>::value>::type>
    CrazyBucket(It beg, It end)
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

int main()
{
    std::vector<int> vInt;
    CrazyBucket<int> cbOK(vInt.begin(), vInt.end());

    int ar[10];
    CrazyBucket<int> cbAlsoOK(ar, ar+10);

    // uncomment for failure test case.
    //std::vector<double> vDbl;
    //CrazyBucket<int> cbFail(vDbl.begin(), vDbl.end());
}

也用静态断言完成:

template<class It>
CrazyBucket(It beg, It end)
{
    static_assert(std::is_same<T, typename std::iterator_traits<It>::value_type>::value,
       "failed to match iterator value type");
    std::cout << __PRETTY_FUNCTION__ << '\n';
}

两者都是限制性的,您应该知道这可能不是您想要的最终目标。比如short的迭代自然会存储为int,不会丢失数据,这种SFINAE会折腾。这也可以通过更多的扩展来克服,但到那时我认为你需要考虑最终是否真的值得。

无论如何,祝你好运。

关于c++ - 将迭代器传递给类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020465/

相关文章:

c++ - BOOST_FOREACH 对 boost::shared_ptr<list> 的迭代

c++ - C++ 中的 HttpListener 类?

c++ - 使用 std::string 打开文件

c++ - 格式化适合语言环境的日和月,不带年

c++ - 为什么char指针得到的是32位的值(ffffff88)

c++ - 在控制台中打印一个填充的正方形

c++ - 使用 std::copy 复制单个字符

c++ - 无需默认构造函数即可插入或更新到 unordered_map

c++ - 为什么 `equal` 在 C++ 中适用于 const char*?

c++ - 如何 "inherit"来自 STL 类的迭代器?