据我所知,基于范围的for循环只能采用c样式的数组,具有已定义成员函数begin()end()的类型的对象或具有免费函数Typebegin(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';
}

附录:
不过,在大多数实际情况下,只要创建一个包含静态beginend成员函数的类的实例就足够了,如Jarod42和Matt McNabb的回答(在我上面发布时,前者已经发布)中所示。
for( auto const& elem : StaticVec() )
{
    // ...
}

如果实例创建可能会带来不利的副作用(现在或以后进行一些维护工作),则可以使用常规解决方案。

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

关于c++ - 基于范围的for循环可以接受类型参数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27502421/

10-11 22:49
查看更多