|  | Home | Libraries | People | FAQ | More | 
      A Concept defines a set of constraints on the types that are stored in an
      any.
    
There are three kinds of concepts.
BOOST_TYPE_ERASURE_MEMBER
          and BOOST_TYPE_ERASURE_FREE
          define concepts of this form.
        
      Each primitive concept defines a single function. A primitive concept must
      be a specialization of a class template, with a static member function called
      apply, which will be executed
      when the function is dispatched by call.
      The template can only take template type parameters. non-type template parameters
      and template template parameters are not allowed.
    
The template parameters of the concept may involve placeholders. The following are considered.
Any other placeholders are ignored.
      A concept is instantiated by constructing an any
      from a raw value or by constructing a binding.
      When a concept is instantiated with a specific set of type bindings, each placeholder
      is bound to a cv-unqualified non-reference type. After replacing each placeholder
      in the template argument list with the type that it binds to, the following
      must hold.
    
// Correct. template<class T = _self> struct foo1 { static void apply(const T& t) { t.foo(); } }; // Wrong. The signature of apply is different from the // primary template template<> struct foo1<int> { static void apply(int i); }; // Wrong. A concept must be a template struct foo2 { static void apply(const _self&); }; // Wrong. apply must be static template<class T = _self> struct foo3 { void apply(const T&); }; // Wrong. apply cannot be overloaded template<class T = _self> struct foo3 { static void apply(T&); static void apply(const T&); }; // Wrong. Only top level placeholders are detected template<class T> struct foo4; template<class T> struct foo4<boost::mpl::vector<T> > { static void apply(const T&); }; // Wrong. Template template parameters are not allowed. template<template<class> class T> struct foo5 { static void apply(T<int>&); };