[C++-sig] class empty: pass

David Abrahams david.abrahams at rcn.com
Sat Jan 19 17:03:11 CET 2002

----- Original Message -----
From: "Ralf W. Grosse-Kunstleve" <rwgk at cci.lbl.gov>

> It frequently happens that I want to expose a simple C++ struct
> to Python, e.g.:
>   struct peak {
>     boost::array<int, 3> index;
>     double value;
>   };
> I often hesitate to use class_builder<> for small types
> like this because I assume that there is a large overhead
> associated with the proliferation of fully-fledged Python
> types. Therefore I just turn these structs into tuples
> or dictionaries. This is not very user-friendly, because
> it is not intuitive what peak[0] and peak[1] are, and
> the notation peak["index"] or peak["value"] is quite
> clunky.
> In pure Python I often use a construct like this:
> class empty: pass
> def foo():
>   result = empty()
>   result.index = (1,2,3)
>   result.value = 345
>   return result
> Could a similar mechanism be provided at the C++ level?
> E.g.:
>   py_peak = empty_builder<peak>;
>   py_peak.def(&peak::index, "index");
>   py_peak.def(&peak::value, "value");
> empty_builder<T> would not build a new extension class for each template
> argument, but reuse the same Python type.

Yes! But how would you make one? Remember, the type of the object is what
you call to create it:
    x = MyClass()

If you have a C++ function which can return them, though, you don't need a
separate type.

> Does this make sense? Would there be a significant saving
> in object code size (particularly in the new system that is
> based on the native Python type system)?

I think it would be small at best. Aren't you just doing this for
convenience? Why don't we discuss the ideal syntax, instead of worrying
about implementation details at this stage?


More information about the Cplusplus-sig mailing list