Vicente J. Botet Escriba wrote:
template <> struct is_pod< blank > : true_type {};
This still breaks dispatch on mpl::true_/mpl::false_. The use case is: void f( mpl::true_ ); void f( mpl::false_ ); struct X; int main() { f( boost::is_something<X>() ); } This is existing code, both inside and outside Boost. Rob Stewart wrote:
Put a few pieces into core and change MPL to use or derive from them. For example, mpl:: true_type can derive from a new boost::true_type (which could be an alias for std:: true_type).
This still breaks the above use case, as boost::is_something will derive
from boost::true_type, but not from mpl::true_.
We could add converting constructors to mpl::bool_ taking core::bool_, which
will fix the above, but may break other, more convoluted uses.
The 'proper' way to handle that (and the problem with type traits using MPL
is not limited to mpl::bool_) is to extract the actual type traits into core
type traits, which do not derive from anything, do not include MPL lambda
support, and whose implementation does not include a non-core library (which
is an issue only for type_with_alignment and common_type). Then, the current
type traits would be rewritten as
template<class T> struct is_something: integral_constant