
On 08/15/12 08:49, *smgreened@obbligato.org wrote:
Hi all,
This might be old hat to verteran boosters but I found it nifty. Maybe it could make a small addition to Boost.
Inspired by Sean Parent's C++Now! talk and the various articles on cpp-next, I've been playing around with value semantics and C++11.
I found an interesting use of pack expansion at stackoverflow and expanded on it in a local project to convert from a traditional inheritance/virtual function model to a more value-centered approach.
It turns out that with pack expansion one can implement "virtual functions" without needing inheritance or pointer/reference semantics. One can consider a vrtual function as "just" a compiler-generated switch statement. With that in mind, here's an example:
----------- [snip] class vehicle { public: enum kind { Car, Bus, Boat, Train, Airplane };
typedef kind_tuple<vehicle, kind::Car, kind::Bus, kind::Boat, kind::Train, kind::Airplane> kinds;
private: [snip] kind the_kind;
public: vehicle(kind k) : the_kind(k) {} [snip]
}; [snip]
Could you not use boost::variant, where the variant which function would return the tag, which is what the above vehicle::the_kind is, in essence: ------------ #include <boost/variant.hpp> enum kind { Car, Bus, Boat, Train, Airplane }; template < kind Kind
class vehicle_kind { }; typedef boost::variant < vehicle_kind<Car> , vehicle_kind<Bus> , vehicle_kind<Boat> , vehicle_kind<Train> , vehicle_kind<Airplane>
vehicle ; ------------ Then couldn't boost::variant library's static_visitor's do the dispatching? -regards, Larry