基于范围的for循环可以采用类型参数吗?

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()在循环中写入的必要性.

Che*_*Alf 6

作为一般解决方案,您可以定义

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)

附录:
在大多数实际情况下,只需创建一个包含静态beginend成员函数的类的实例就足够了,如Jarod42和Matt McNabb的答案所示(前者在我发布上述内容时已经发布),例如:

for( auto const& elem : StaticVec() )
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果实例创建可能会产生不良副作用,现在或可能在未来某些维护工作之后,则使用通用解决方案.

否则,如果实例创建基本上是免费的,我会去那.