我创建了一个只读迭代器,它允许我在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> &'
答案 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中的等效功能。
如果您既不能使用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) {}
答案 1 :(得分:-1)
我很抱歉,但不,这是不可能的,因为容器没有公共基类。你必须为每个容器编写一个运算符,悲伤新闻!
虽然如果操作符函数的行为始终相同,您可以创建一个包含代码的宏,并为每个容器类型复制粘贴它^ _ ^