
On Feb 6, 2011, at 12:15 PM, Germán Diago wrote:
Hi all. I'm implementing a framework to use runtime concepts for a project of myself. I would like to know the interest in that library. For now, I have a proof of concept working.
The goal of the library, for now, is to be able to use objects of differente types without having any inheritance requirements and being nonintrusive.
It appears that your example is "intrusive" by requiring a typedef ModelOfType in the classes implementing your concept in order to perform the proper 'cast' whereas my implementation is 100% non-intrusive.
The code has my own standards for naming conventions, but that can be changed later when I have something ready for consumption.
It appears that you and I are working on the same problem from two different angles. I apologize for not reading your post before posting my own regarding [boost][interfaces]. It appears that your implementation requires more boilerplate code and provides no ability to define dynamic interfaces such as exposing any object that defines a "concept'" as a json-rpc server or create a json-rpc client based upon a "concept" definition. So my question to you, Germán Diago, in what ways is my solution undesirable for your application? To implement your example using "boost idl" you would do something like: namespace idl_definition { struct DeviceC { std::size_t getCapacityInMB() const; }; struct IPlugableDeviceC : DeviceC { void onOpen(); void onRemove(); }; } BOOST_IDL_INTERFACE( DeviceC, (), (getCapacityInMB) ) BOOST_IDL_INTERFACE( IPlugableDeviceC, (IPlugableDeviceC), (onOpen) (onRemove) ) int main( int argc, char** argv ) { IpodDevice ipod; LegacyDevice legacy_device; std::vector<DeviceC> devices; devices.push_back( move(ipod) ); devices.push_back( move(legacy_device) ); IPlugableDeviceC plugable_device = ??? I guess I need a way to 'down cast' devices[0].getCapacityInMB(); } After attempting to implement your example using my API I realized that my solution currently does not provide a down-casting option while maintaining your syntax. However down casting is possible like so: int main( int argc, char** argv ) { IpodDevice ipod; LegacyDevice legacy_device; std::vector<DeviceC*> devices; devices.push_back( new IPluggableDeviceC(move(ipod)) ); devices.push_back( new IPluggableDeviceC(move(legacy_device)) ); devices[0].getCapacityInMB(); IPlugableDeviceC* plugable_device = dynamic_cast<IPluggalbeDeviceC*>(devices[1]); pluggable_device->onOpen(); } Additionally, my implementation supports public members as part of the 'Concept' which, as far as I can tell, is impossible with your design. Dan