python::object && mpl
Arnaldur Gylfason
arnaldur at decode.is
Fri Jan 11 17:23:51 CET 2002
<<<
> struct use_generator
> {
> template <class Generator, class Base>
> struct apply
> {
> typedef Generator<Object,checked,Base> type;
------------------^^^^^^^^^
this requires Generator to be a template template argument, not
supported by
all compilers. That's one reason to use the MPL metafunction approach:
struct indexable
{
tempalate class<T,...>
struct apply
{
typedef indexable_t<T,...> type;
// where indexable_t is your "indexable", renamed
};
};
Now you can pass indexable_generator as a regular template type
argument.
>>>
I see.
If our generators have 2 parameters we could use binary_function:
template <class Object>
struct use_generator
{
template <class Generator, class Base>
struct apply
{
typedef mpl::binary_function<Generator,Object,Base>::type type;
};
};
It would also apply to other usage of our generators as metaclass
functions.
There is this checked thing though.
<<<
One possibility might be:
template <class CapabiltiesList, class CheckedList>
struct object
: ...
{
};
You'd want to STATIC_ASSERT that all elements of CheckedList were in
CapabilitiesList. Capabilities in CheckedList would also be checked.
>>>
That's one way to do it. Have to think about this more thoroughly before I
form an opinion about the best approach.
<<<
Another possibility would be to make all capabilities into templates, so
template <class
>>>
Something missing?
<<<
BTW, if we are going to allow some features to be present in the
interface
but unchecked there should be an interface for checking for support of
those
features without throwing an exception:
void f(sequence x)
{
if (x.has_capability<sliceable>()) {...}
}
This could be a reason to make the metafunctions available even if you
don't
make the generalized (metaprogram) object template now.
>>>
Sounds good!
How about has_capabilities on a type_list of capabilities and using
mpl::for_each to validate all?
x.has_capabilities<type_list<indexable,...> >() /
x.has_capabilities<integral_capabilites>() / ...
(integral_capabilities = mpl::type_list<addable,...>)
Cheers
Arnaldur
More information about the Cplusplus-sig
mailing list