$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Alexander Nasonov (alnsn-nospam_at_[hidden])
Date: 2002-11-25 11:54:31
I'm currently working on boost.dynamic_any library which covers this issues.
It's almost done. I need to implement some details and write a
documentation. First documentation draft is here:
http://cpp-experiment.sourceforge.net/boost/libs/dynamic_any/doc/
Library can be downloaded from
http://prdownloads.sourceforge.net/cpp-experiment/dynamic_any-1.0.1.tar.gz?download
For your convinience, I put an example (most similar to comparable_any) in
the body of my post.
--
Alexander Nasonov
Remove -nospam from my e-mail address for timely response
// File $BOOST_ROOT/libs/dynamic_any/example/print-set.cpp
#include "boost/dynamic_any/operations.hpp"
#include "boost/dynamic_any/function.hpp"
#include "boost/dynamic_any/any.hpp"
#include <boost/mpl/list.hpp>
#include <set>
#include <exception>
#include <iostream>
#include <string>
typedef boost::mpl::list<
boost::dynamic_any::less,
boost::dynamic_any::to_ostream<char>
> functions;
typedef boost::dynamic_any::any<functions> any;
typedef std::set<any> any_set;
const char * get_type_name(const std::type_info & info);
int main()
{
try
{
any_set all;
any a;
all.insert(a);
all.insert(any());
int i = 1;
all.insert(any(i));
all.insert(any(&i));
int j = 2;
all.insert(any(j));
all.insert(any(&j));
const double pi = 3.1415926;
all.insert(any(pi));
all.insert(any(pi / 2));
all.insert(any(-pi));
all.insert(any(&pi));
const void * ptr = 0;
all.insert(any(ptr));
all.insert(any(&ptr));
ptr = &i;
all.insert(any(ptr));
all.insert(any(&ptr));
ptr = &j;
all.insert(any(ptr));
all.insert(any(&ptr));
const any b(4);
all.insert(b);
all.insert(b);
a = std::string("a");
all.insert(a);
a = std::string("b");
all.insert(a);
// Show 'all'
std::cout << "type / value\n-------------------\n";
for(any_set::const_iterator it = all.begin(); it != all.end(); ++it)
{
std::cout << get_type_name(it->type()) << " / ";
std::cout << *it << '\n';
}
std::cout << std::flush;
}
catch(const std::exception & ex)
{
std::cerr << ex.what() << std::endl;
}
catch(const char * what)
{
std::cerr << what << std::endl;
}
}
const char * get_type_name(const std::type_info & info)
{
if(info == typeid(void))
return "void";
else if(info == typeid(const void *))
return "const void *";
else if(info == typeid(const void **))
return "const void **";
else if(info == typeid(int))
return "int";
else if(info == typeid(int *))
return "int *";
else if(info == typeid(double))
return "double";
else if(info == typeid(const double *))
return "const double *";
else if(info == typeid(std::string))
return "std::string";
else
return info.name();
}