假设我编写了处理一系列元素的模板函数。
template <typename Iter>
void func(Iter first, Iter last);
在此函数中,我想调用一些希望获得连续缓冲区及其大小的低级c函数。做这些事情的通用方法是将我的范围复制到连续的容器中,然后调用c函数。
template <typename Iter>
void func(Iter first, Iter last)
{
typedef typename iterator_traits<Iter>::value_type value_type;
vector<value_type> buf(first, last);
c_func((void*) buf.data(), buf.size() * sizeof(value_type));
}
但是,如果迭代器已经指向某个连续的内存空间,则会执行额外的复制。
因此,问题是,是否有办法确定迭代器是否指向连续的内存空间,以及是否可以在这种情况下使我的函数专门化。
目前,还没有直接的方法来确定是否将迭代器用于连续内存。有提议添加迭代器优化(例如参见n3884),但是没有类似的东西,并且无法检测为不同的迭代器添加的属性,您将很难确定此特征。
需要实现者支持的关键问题是未指定迭代器类型的名称。结果,您无法创建适用于所有已知为连续迭代器类型的特征。由于迭代器的类型std::vector<T>
和std::array<T>
可以相同,因此T*
我认为您甚至不能创建可移植的专业化版本。
但是,您可以做的是在特征中测试迭代器类型是否匹配其值类型的已知迭代器类型之一。例如:
template <typename T, typename It>
struct test_iterator
: std::integral_constant<bool,
std::is_same<T*, It>::value
|| std::is_same<typename std::vector<T>::iterator, It>::value
|| std::is_same<std::string::iterator, It>::value
|| std::is_same<std::wstring::iterator, It>::value
> {
};
template <typename It>
struct is_contiguous
: std::integral_constant<bool,
test_iterator<typename std::iterator_traits<It>::value_type,
It>::value> {
};
[我没有尝试编译代码,即,它可能散布着小的错字;一般方法应该有效,但是]
要添加,例如,std::array<T, N>
您需要某种方式以静态方式确定尺寸。我想那是行不通的。可能还需要测试各种const_iterator
s。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句