假设我有一个 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
(e.g., decltype(*first)
),但我对 C++11 之前的解决方案特别感兴趣,因为我使用旧的 C++ 编译器(gcc v4.4.7)。
正如正确观察到的,value_type
输出迭代器的值为void
。因此,除了替换它之外,没有什么可做的:
typename std::iterator_traits<OutputIterator>::value_type elem;
有了这个
decltype(*first) elem;
(即使标准不保证它会工作 - 可能会通过取消引用输出迭代器来返回代理)。
正如您所说,没有 C++11 解决方案,因此可能需要重新设计。以下是一些选项:
1.传递容器
您可以传递对容器的引用,而不是第一个元素的迭代器。看起来你想要的只是一个push_back
.
template<template<typename,typename> class stlContainer>
void copy_container(
MyMontainer const &cont, OutputIterator first)
{
// insertion in stlContainer
那么您所需要的只是一层特征来分派到每个容器插入的正确实现
2. 传递一个额外的模板参数
值类型可以是额外的模板参数。
template<typename value_type, typename OutputIterator>
void copy_container(MyMontainer const &cont, OutputIterator first)
{
value_type elem;
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)