I think your second solution is what will work. You can use unsafe code and a void pointer combined with a type descriptor string. I would probably combine the void pointer and string in a struct. On Aug 23, 2013 10:27 AM, "Oren Ben-Kiki" <[email protected]> wrote:
> That would require me to declare up front which types were usable and > which weren't. I'm looking for a solution where I don't need to do that; > that is, allow me to add new components to the system with new > configuration parameter types, without having to go to a central source > location and declare these types there. > > > On Fri, Aug 23, 2013 at 7:54 AM, Abhijeet Gaiha > <[email protected]>wrote: > >> You could define an enum that encapsulates all known types. >> >> enum monster { >> Integer(int), >> Float(float), >> .... >> } >> >> Then use a container for this type. >> On Aug 23, 2013 10:20 AM, "Oren Ben-Kiki" <[email protected]> wrote: >> >>> Is it possible to implement something like Haskell's Dynamic value >>> holder in Rust? (This would be similar to supporting C++'s dynamic_cast). >>> Basically, something like this: >>> >>> pub struct Dynamic { ... } >>> impl Dynamic { >>> pub fn put(value: ~T) { ... } >>> pub fn get() -> Option<T> { ... } >>> } >>> >>> I guess this would require unsafe code... even so, it seems to me that >>> Rust pointers don't carry sufficient meta-data for the above to work. A >>> possible workaround would be something like: >>> >>> pub struct Dynamic { type_name: ~str, ... } >>> impl Dynamic { >>> pub fn put(type_name: &str, value: ~T) { Dynamic { type_name: >>> type_name, ... } } >>> pub fn get(&'a self, type_name: &str) -> Option<&'a T> { >>> assert_eq!(type_name, self.type_name); ... } } >>> } >>> >>> And placing the burden on the caller to always use the type name "int" >>> when putting or getting `int` values, etc. This would still require some >>> sort of unsafe code to cast the `~T` pointer into something and back, while >>> ensuring that the storage for the `T` (whatever its size is) is not >>> released until the `Dynamic` itself is. >>> >>> (Why do I need such a monstrosity? Well, I need it to define a >>> `Configuration` container, which holds key/value pairs where whoever sets a >>> value knows its type, whoever gets the value should ask for the same type, >>> and the configuration can hold values of "any" type - not from a predefined >>> list of types). >>> >>> Is such a thing possible, and if so, how? >>> >>> Thanks, >>> >>> Oren Ben-Kiki >>> >>> _______________________________________________ >>> Rust-dev mailing list >>> [email protected] >>> https://mail.mozilla.org/listinfo/rust-dev >>> >>> >
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
