
"Peder Holt" <peder.holt@gmail.com> wrote <vertleyb@hotmail.com> wrote:
What I totaly don't understand is how you can get the compiler reuse templates, and still set the compile-time variables. As far as I understand, setting a compile-time variable is a side-effect of a template instantiation, which IMO contradicts the reuse...
Earlier, I created a function with a return value that instantiated a compile time constant. encode_type<T,NEXT_INDEX()> start(const T&);
Could you explain this in more detail? I am pretty uncomfortable with the whole idea of compile-time variables... As far as I understand now, to set them, the compiler needs to instantiate the template which contains the code that sets the variable, something like this: template<> struct encode { SET(compile_var); }; If encode is reused (not instantiated), the variable is not set. I believe I raised this question some time ago, and you said you added an additional parameter to force the instantiation... How then it can be reused?
My implementation of decoding: template<> struct decode_impl<CONST_ID> { template<typename Iter> struct decoder { typedef typename decode_impl<Iter::value>::decoder<BOOST_DEDUCED_TYPENAME Iter::next> next_decoder; typedef typename next_decoder::type const type; typedef typename next_decoder::end end; }; }; Your implementation of decode: template<class Iter> struct decode_type_impl<mpl::int_<CONST_ID>, Iter> { typedef decode_type<Iter> d1; typedef const typename d1::type type; typedef typename d1::iter iter; };
Where template<class Iter> struct decode_type : decode_type_impl<typename mpl::deref<Iter>::type, typename mpl::next<Iter>::type> {};
As far as I can see, these implementation are very similar.
I actually don't think they are VERY similar. We would write more code trying to fit them together, then both of them already have. This is a matter of taste, of course, but I am against reuse in such cases. This would just put more fog on things that are not that easy to understand in the first place. Regards, Arkadiy