If I have a pair of iterators, I can construct a set like so: std::set<SomeType> s(it1, it2); If instead I have a range, I can adapt it like so: std::set<SomeType> s(boost::begin(range), boost::end(range)); However, my range object is being constructed on the fly. I'd like to be able to do: std::set<SomeType> s(MakeRange(args)); But clearly this is not supported by the library. It seems I need to store the range object in a variable in order to do this, which defeats the syntax-simplifying benefits of using ranges. Can this be avoided? Are there some recommended no-overhead tricks for doing this that achieve a clean syntax? Implicit conversions? Explicit "ToSet" conversion functions? Can boost.assign be of help? (My initial reading of the assign documentation suggests not, but perhaps I'm missing something). I'm also not averse to a macro so long as it looks "language-like," but so far I haven't produced anything satisfactory. Has anyone else wrestled with this one and come out victorious? Thanks, -Gabe