From Python to c++

nnorwitz at nnorwitz at
Wed Mar 22 08:11:24 CET 2006

Marco Aschwanden wrote:
> This is actually a c++ problem. Got no satisfying answer on comp.lang.c++.
> Maybe you can help better because I know, there are many c++-converts ;).
> Suppose you've got the following list (first line has field names, second
> line has types and any row after is data):
> csv = "name,age,place\nstring,int,string\nMac,25,Zurich\nMike,55,Oslo"
> and you would like to turn it into a dictionary:
> parsed = {
>   "name":["Mac", "Mike"],
>   "age":[25, 55],
>   "place":["Zurich", "Oslo"]
> }
> A trivial task in Python. In C++ it is cumbersome. I was thinking to put
> the parsed data into a map:
> map<string, vector<???> >
> I have no problem with the key (string) but the value (vector) needs to be
> of varying type. I think C++-STL does not allow what I want.

This is so scary, I probably shouldn't post this.  It sounds from your
description, you really want RTTI.  I haven't done this in a long
while, so I'm not sure there is an easier way.  But the program below
works and seems like it may be what you are asking for.

#include <stdio.h>
#include <vector>

struct Any {
        virtual ~Any() { };

typedef std::vector<Any*> List;

class Str : public Any {
        Str(const char *s) : value_(s) {};
        operator const char*() const {
                return value_;
        const char *value_;

class Int : public Any {
        Int(int s) : value_(s) {};
        operator int() const {
                return value_;
        int value_;

int main(int argc, char **argv) {
        Str anyone = "someone";
        Int my_age = 5;
        List list;

        for (List::const_iterator i = list.begin(); i != list.end();
i++) {
                const Int *iptr;
                const Str *str;
                if ((str = dynamic_cast<const Str*>(*i)))
                        printf("string: %s\n", (const char*) *str);
                else if ((iptr = dynamic_cast<const Int*>(*i)))
                        printf("int: %d\n", (int) *iptr);
                        printf("clueless: %p\n", *i);

        return 0;

More information about the Python-list mailing list