我正在使用typedef来定义程序中容器的类型,这样我就可以在使用普通STL容器和STXXL容器之间轻松切换,顺序如下:
typedef stxxl:vector<Data> MyContainer;
Run Code Online (Sandbox Code Playgroud)
要么
typedef std:vector<Data> MyContainer;
Run Code Online (Sandbox Code Playgroud)
一个难点是STXXL提供了一个特殊版本std::for_each,stxxl::for_each它针对STXXL容器进行了优化.当MyContainer的typedeffed为a时,我更喜欢使用此函数stxxl::vector.
一种解决方案是定义我自己的for_each函数,该for_each函数调用正确的函数并在我想要调用时使用它for_each.
我正在研究的另一个解决方案是重载/特化,std::foreach以便stxxl::for_each在使用stxxl::vector<Data>::(const_)iterator第一个和第二个参数调用它时调用它.
我不能让第二个想法工作.我尝试过以下方法:
namespace std
{
template <class UnaryFunction>
UnaryFunction for_each(stxxl:vector<Data>::const_iterator first,
stxxl:vector<Data>::const_iterator last, UnaryFunction f)
{
stxxl::for_each(first, last, f, 4);
}
}
Run Code Online (Sandbox Code Playgroud)
与非const迭代器的类似函数一起使用.虽然他们没有被召唤.
这个问题的首选解决方案是什么?我怎样才能让我的版本std::for_each为stxxl::vector得到所谓的迭代器?
更新:我发布了第二个想法.问题是我包含了错误的文件(哎呀......).但问题仍然存在:这个问题的首选解决方案是什么?是否可以重载std :: for_each,因为std命名空间不适合凡人?
您可以在std(17.4.3.1)中专门化模板,但不能添加重载.您的定义是重载,而不是标准for_each模板的特殊化,并且在任何情况下,函数都不能部分专门化.所以在命名空间std中放置任何可能做你想要的定义都是未定义的.
不过,ADL应该能够顺利完成这项工作,而不需要这样做.我假设stxxl迭代器在stxxl命名空间中,所以for_each(first, last, f, 4);应该调用stxxl::for_each.如果需要std::for_each,您可以在调用时完全限定名称.