| Home | Libraries | People | FAQ | More

## Struct deduce_domain

boost::proto::deduce_domain — A pseudo-domain for use in functions and metafunctions that require a domain parameter. It indicates that the domain of the parent node should be inferred from the domains of the child nodes.

## Synopsis

    // In header: <boost/proto/domain.hpp>

    struct deduce_domain {
    };

## Description

When `proto::deduce_domain` is used as a domain — either explicitly or implicitly by `proto::make_expr()`, `proto::unpack_expr()`, or Proto's operator overloads — Proto will use the domains of the child expressions to compute the domain of the parent. It is done in such a way that (A) expressions in domains that share a common super-domain are interoperable, and (B) expressions that are in the default domain (or a sub-domain thereof) are interoperable with all expressions. The rules are as follows:

- A sub-domain is stronger than its super-domain.
- `proto::default_domain`, `proto::basic_default_domain` and all their sub-domains are weaker than all other domains.
- `proto::basic_default_domain` is weaker than `proto::default_domain`.
- For each child, define a set of domains SN that includes the child's domain and all its super-domains.
- Define a set IS that is the intersection of all the individual sets SN that don't contain `proto::default_domain` or `proto::basic_default_domain`.
- Define a set IW that is the intersection of all the individual sets SN that contain `proto::default_domain` or `proto::basic_default_domain`.
- Define a set P that is the union of IS and IW.
- The common domain is the strongest domain in set P, with the following caveats.
- Let U be the union of all sets SN. If the result is `proto::default_domain` or `proto::basic_default_domain` and U contains an element that is not `proto::default_domain` or `proto::basic_default_domain`, it is an error.

Note: the above description sounds like it would be expensive to compute at compile time. In fact, it can all be done using C++ function overloading.