c++ - Can a range-based for loop take a type argument? -
from can tell, range-based loops can take c-style array, object of type has member functions begin()
, end()
defined, or object of type type
free functions begin(type)
, end(type)
can found adl.
is there way make loop take type argument, code compiles?
class staticvec{ //shortened implementation static myiterator begin(); static myiterator end(); }; void foo() { for(auto elem : staticvec){ dosomething(elem); } }
i omit necessity of writing staticvec::values()
in loop.
as general solution can define
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(); }
and can write e.g.
auto main() -> int { for( auto elem : static_collection<static_vec>() ) { std::cout << elem << ' '; } std::cout << '\n'; }
addendum:
in practical cases suffice create instance of class holding static begin
, end
member functions, shown in jarod42’s , matt mcnabb’s answers (the former posted when posted above), e.g.
for( auto const& elem : staticvec() ) { // ... }
if instance creation can have undesirable side effects, or perhaps after future maintainance work, use general solution.
otherwise, if instance creation free, i’d go that.
Comments
Post a Comment