据我所知,基于范围的for循环只能采用c样式的数组,具有已定义成员函数begin()
和end()
的类型的对象或具有免费函数Type
和begin(Type)
的end(Type)
类型的对象可以在ADL中找到。
有没有一种方法可以使循环采用类型参数,以便像这样的代码进行编译?
class StaticVec{
//shortened implementation
static myIterator begin();
static myIterator end();
};
void foo() {
for(auto elem : StaticVec){
dosomething(elem);
}
}
我想省略在循环中编写
StaticVec::values()
的必要性。 最佳答案
作为一般解决方案,您可以定义
template< class Type > struct Static_collection {};
template< class Type >
auto begin( Static_collection<Type> const& )
-> decltype( Type::begin() )
{ return Type::begin(); }
template< class Type >
auto end( Static_collection<Type> const& )
-> decltype( Type::end() )
{ return Type::end(); }
然后你可以写例如
auto main() -> int
{
for( auto elem : Static_collection<Static_vec>() )
{
std::cout << elem << ' ';
}
std::cout << '\n';
}
附录:
不过,在大多数实际情况下,只要创建一个包含静态
begin
和end
成员函数的类的实例就足够了,如Jarod42和Matt McNabb的回答(在我上面发布时,前者已经发布)中所示。for( auto const& elem : StaticVec() )
{
// ...
}
如果实例创建可能会带来不利的副作用(现在或以后进行一些维护工作),则可以使用常规解决方案。
否则,如果实例创建基本上是免费的,那我会去做的。
关于c++ - 基于范围的for循环可以接受类型参数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27502421/