Handling visit-by-value
Sometimes the visitation semantics of a class' members should been through a pair of accessor methods or functions, rather than directly on an object data member.
For example:

XVF_CLASS_BEGIN(Temperature);
class Temperature {
  private:
    double _f; // Fahrenheit: f = (c * 1.8) + 32
    double _c; // Celsius:    c = (f - 32) / 1.8

  public:
  Temperature() { celsius(0); }

  // Getter, setter.
  double fahrenheit() const { return _f; }
  void fahrenheit(double x) {
    _f = x; _c = (_f - 32) / 1.8;
   }

  // Getter, setter.
  double celsius() const { return _c; }
  void celsius(double x) {
    _c = x; _f = _c * 1.8 + 32;
  }

  XVF_CLASS_METHODS(XVF_);
  XVF_CLASS_VISIT_BEGIN_INLINE(Temperature)
  {
     // Visit by Value
     XVF_VAL("fahrenheit", // name
             double,       // type
             _xvf_this->fahrenheit(),
                           // getter
             _xvfv_this->fahrenheit(XVF_TEMP)
	                   // setter
     );
     XVF_VAL("celsius",
             double,
             _xvfv_this->celsius(),
             _xvfv_this->celsius(XVF_TEMP));
  }
  XVF_CLASS_VISIT_END()
};
XVF_CLASS_END(Temperature);
XVF_CLASS_INSTANCE(Temperature);

If any visitor updates to the "fahrenheit" or "celsius" members of a Temperature object both the Fahrenheit and Celsius values will be synchronized through the getter and setter methods in Temperature.