iFr*_*cht 2 c++ static for-loop c++11
从我所知,范围为基础的循环可以仅采取一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想省略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(); }
Run Code Online (Sandbox Code Playgroud)
然后你可以写例如
auto main() -> int
{
for( auto elem : Static_collection<Static_vec>() )
{
std::cout << elem << ' ';
}
std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)
附录:
在大多数实际情况下,只需创建一个包含静态begin和end成员函数的类的实例就足够了,如Jarod42和Matt McNabb的答案所示(前者在我发布上述内容时已经发布),例如:
for( auto const& elem : StaticVec() )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果实例创建可能会产生不良副作用,现在或可能在未来某些维护工作之后,则使用通用解决方案.
否则,如果实例创建基本上是免费的,我会去那.