1) Best to avoid void* if possible. You could use boost::any, which can still hold any type, but is somewhat safer than using void*. It has a special casting function for safe casting from type to type.
Alternately, you could have an abstract base class, and have an array of pointers to it. Then derive from it to implement the particular functionalities. (I'm not sure I've explained this last bit very well...)
2) Not directly I don't think. Perhaps you could have a global std::stack<std::string> which you would use to keep track of this?
3) Those are called
exception specifications. Superficially, what it means is that myfunc() might throw the exception "ExceptioN", but it won't throw anything else. However, it does not work like this. Exception specifications make the compiler do all kinds of horrible things, and in general there is no benefit, so
do not use exception specifications in general. There are, of course, a few subtleties, but that's basically it.
Further reading:
http://www.gotw.ca/publications/mill22.htm