【发布时间】:2014-09-26 21:44:41
【问题描述】:
假设我有一个 C 容器(例如 MyContainer),其中包含的对象存储为 void* 指针。遍历这个容器的元素的唯一方法是通过两个接口函数:
-
getFirstElem(MyContainer const&, void*):输出容器的第一个元素。 -
getNextElem(MyContainer const&, void*):输出容器的下一个元素。
我想编写一个通用函数,通过上面提到的接口函数遍历这个 C 容器的元素,并将它们的值复制到 C++ 容器中(例如std::vector)。
到目前为止我做了什么:
template<typename OutputIterator>
void
copy_container(MyContainer const &cont, OutputIterator first) {
typename std::iterator_traits<OutputIterator>::value_type elem;
if(getFirstElem(cont, &elem)) {
do {
*first = elem;
++first;
} while(getNextElem(cont, &elem))
}
}
上面的例子适用于普通的迭代器。但是,它无法使用输出迭代器进行编译(例如,copy_container(cont, std::back_inserter(myvector));)。
原因是在参数类型是输出迭代器的情况下,std::iterator_traits::value_type 会导致 void。
有没有办法让这个通用函数也适用于输出迭代器?
我知道在 C++11 中可以使用 decltype(例如 decltype(*first))来完成,但我对 C++11 之前的解决方案特别感兴趣,因为我使用的是旧的 C++ 编译器( gcc v4.4.7)。
【问题讨论】:
-
即使在 C++11 中,
decltype(*first)也不是 proxy 的解决方案原因(std::back_inserter就是这种情况)。