gpt4 book ai didi

c++ - 基于范围的 for 循环可以接受类型参数吗?

转载 作者:太空狗 更新时间:2023-10-29 23:27:51 27 4
gpt4 key购买 nike

据我所知,基于范围的 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';
}

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

for( auto const& elem : StaticVec() )
{
// ...
}

如果实例创建可能会产生不良副作用,现在或可能在将来进行一些维护工作之后,请使用通用解决方案。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com