从std容器frm任意源对象复制

时间:2013-05-18 08:55:38

标签: c++ containers std

我创建了一个只读迭代器,它允许我在for循环中更方便地使用它,然后使用std迭代器,类似于FOREACH的增强功能(不是很好但足够好:))

现在看起来像这样:

for(ReadOnylIterator<MyClass *> class = parent.getIterator(); class.end(); ++class)
   class->function();

我现在遇到的问题是,我必须在返回迭代器的父项上实现一个函数。由于std容器具有完全相同的语法,我想知道是否可以在Iterator上定义一个复制构造函数/赋值运算符,它接受任何std :: containers并创建副本本身,而不是要求类返回它

当然我想避免自己定义所有这些,就像它们有很多:

ReadOnlyIterator<T> &operator=(std::list<T> const &v)
ReadOnlyIterator<T> &operator=(std::vector<T> const &v)
...

有办法做到这一点吗?当我查看向量的来源时,我没有看到一个共同的基类,所以我认为它可能不合适。

我不知道为什么赋值运算符不起作用。

在我的代码中,我测试它是这样的:

std::vector<SimpleClass *>t;
ReadOnlyIterator<SimpleClass *> &it = t;

我得到了

error C2440: 'initializing' : cannot convert from 'std::vector<_Ty>' to 'ReadOnlyIterator<T> &'

2 个答案:

答案 0 :(得分:1)

如果我理解正确,这应该有效:

#include <type_traits>

template <typename Container>
typename std::enable_if<std::is_same<T, typename Container::value_type>::value, ReadOnlyIterator<T>&>::type operator= (const Container &v);

上面的代码使用C ++ 11。如果您无权访问,则可以使用Boost中的等效功能。

Live example


如果您既不能使用C ++ 11也不能使用Boost,您可以自己编写必要的类:

template <typename T, typename U>
struct is_same
{
    enum { value = 0 };
};

template <typename T>
struct is_same<T, T>
{
    enum { value = 1 };
};

template <bool, typename>
struct enable_if
{};

template <typename T>
struct enable_if<true, T>
{
    typedef T type;
};

要在构造函数中使用它,请按以下方式定义:

template <typename Container>
ReadOnlyIterator(const Container &v, typename enable_if<is_same<T, typename Container::value_type>::value, void>::type * = 0) {}

Live example

答案 1 :(得分:-1)

我很抱歉,但不,这是不可能的,因为容器没有公共基类。你必须为每个容器编写一个运算符,悲伤新闻!

虽然如果操作符函数的行为始终相同,您可以创建一个包含代码的宏,并为每个容器类型复制粘贴它^ _ ^