
Iain Denniston wrote:
1. Is it a generalization of the std::ios_base::flags approach?
As I understand it std::ios_base::flags will accept any integer - valid or otherwise.
Here in standard library of cygwin gcc 3.4.4 it doesn't.
My library would be used to prevent invalid integers being passed (though would require valid flags be members of a single enum). Obviously in the case of std::ios_base::flags it would require a rewrite so's the argument would be of type boost::flags<...>
Its argument is <CODE>std::ios_base::fmtflags</CODE> here.
2. It'd be more convenient without <CODE>flags<foo>(...)</CODE> conversion, wouldn't it?
[...] if you're passing multiple flags the only way I could think of making it work would be to provide a constructor that accepts integers - which would defeat the purpose of the library.
Well, I also don't think it is possible with integers, but it is possible with flags being not integers like above. Alternatively, can you make it <CODE>flags(foo_1) | foo2</CODE> (with <CODE>flags</CODE> being function) or <CODE>flags | foo_1 | foo2</CODE>? By the way, why not perform left shift in flags constructor instead of enum?
3. Can <CODE>flags<foo>(foo_1) | foo_2</CODE> be used as a compile-time constant?
I'm not sure I entirely understand what you are getting at here - what is it you want to do?
I want it to be usable as a template parameter or switch case. For instance, <CODE>class_parametrized_with_iosflags<std::ios_base::dec | std::ios_base::left></CODE> will not compile. What about <CODE>class_parametrized_with_foo<flags<foo>(foo_1) | foo_2></CODE>? With Best Regards, Marat