0

我创建了一个只读迭代器,它允许我在 for 循环中更方便地使用它,然后使用 std 迭代器,类似于 boost 对 FOREACH 所做的(不是那么好但足够好:))

现在看起来像这样:

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

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

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

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> &'
4

2 回答 2

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 的等效功能。

活生生的例子


如果你既不能使用 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;
};

要在构造函数中使用 this,请像这样定义它:

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

活生生的例子

于 2013-05-18T09:49:37.100 回答
-1

我很抱歉,但不,这是不可能的,因为容器没有通用的基类。您必须为每个容器编写一个运算符,可悲的消息!

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

于 2013-05-18T09:17:56.867 回答