
AMDG On 02/27/2013 04:49 PM, Chris Stankevitz wrote:
On Wed, Feb 27, 2013 at 4:08 PM, Chris Stankevitz
wrote: Can you modify the attached program so that the object TCPositionTraits holds all the traits for the TCPosition object. Not just the traits for the "double" parameters, as is currently the case. Notably missing from TCPositionTraits is a reference to TCPosition::mSteps.
Attached is an example of how do do this. Drawback: the TCPositionTraits object now has a lot of typing in it. And if/when you create another object (e.g. TCEmployeeTraits) you are going to have to do a lot of typing again. There will be a lot of code duplication.
Here's a rough sketch of an interface for a completely different way of going about it. I haven't filled out the implementation of the two macros and for_each_with_traits, but I believe that it is possible using Boost.Fusion. The basic method would be to use BOOST_FUSION_DEFINE_STRUCT_INLINE for TCCLASS, use some kind of template specialization for TCMEMBERTRAITS to associate the trait with the member and implement for_each_with_traits using a combination of fusion zip, for_each, and unfused. template<class T> struct TCTraits; template<> struct TCTraits<double>; // identical to TCDoubleTraits TCCLASS(TCPosition, (double, mLatitude) (double, mAltitude) (unsigned, mSteps) ); TCMEMBERTRAITS(TCPosition::mLatitude) = { "Latitude", "deg", 5, 180/Pi }; TCMEMBERTRAITS(TCPosition::mAltitude) = { "Altitude", "m MSL" }; TCMEMBERTRAITS(TCPosition::mSteps) = { "Steps" }; struct printer { bool WithLabel; bool WithUnits; typedef void result_type; template<class T> void operator()(const T& t, const TCTraits<T>& traits) { std::cout << traits.getString(t, WithLabel, WithUnits) << std::endl; } }; template<class T> void PrintValues(const T& t, bool WithLabel, bool WithUnits) { for_each_with_traits(t, printer{WithLabel, WithUnits}); } In Christ, Steven Watanabe