String-to-Class Object Instantiation: Exploration in C
In C , the question arises: can we generate objects from strings containing their class names, avoiding the need for exhaustive knowledge of derived classes and if-else blocks? C lacks a built-in mechanism for this, unlike C# with its Reflection capability. However, there are workarounds that enable us to achieve this functionality.
One approach involves using a map for type mapping. We create a template function createInstance to generate objects, and a map_type map that maps class names to their corresponding function pointers. This allows us to obtain new instances by simply accessing the map using the class name string.
Another solution is to enable classes to register themselves at runtime. We have a static method getMap in BaseFactory that returns a map_type pointer, which is created upon the first call and never deleted. Classes can use the DerivedRegister struct to register themselves, passing their class names as arguments. This approach ensures that new classes are automatically included in the mapping process.
For unrelated types without a shared base class, we can employ boost::variant to accommodate their return values. A boost::variant acts like an union, carrying information about its internal type. By utilizing this concept, we can map class names to function pointers that return boost::variant objects, which can hold the desired type instances.
In C , we have the option to use Boost.Function for decoupling our code from specific functions or types. The mapping structure would then use a map that maps class names to Boost.Function instances, which can be invoked to create objects.
These methods offer ways to dynamically generate objects from string representations of their class names in C . While they require some manual configuration, they provide flexibility and avoid the need for exhaustive branching logic in the factory class.
The above is the detailed content of How Can I Instantiate C Objects from Strings Containing Their Class Names?. For more information, please follow other related articles on the PHP Chinese website!