-----Original Message----- From: Boost-users [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Alex Sent: 07 February 2014 18:48 To: boost-users@lists.boost.org Subject: Re: [Boost-users] [MPL] implementing a "trait"? -----Original Message----- From: Boost-users [mailto:boost-users-bounces@lists.boost.org] On Behalf Of John M. Dlugosz I want to mark certain types as being of a category of my invention (e.g. is_pretty), for purposes of using enable_if in the same manner is standard type traits such as is_arithmetic etc. The trait will be false by default, and I'd declare something to nominate types that should be seen to have that trait. I want it to follow inheritance; if B has been declared to be in my category, and C is derived from B, then C will also be in that category without needing to do anything more (though some way to turn it _off_ would be available). -----End Original Message----- Now have a simpler solution: #include <iostream> #include <type_traits> #include <utility> class A{}; //pretty; class B{}; // not pretty class C : public A{}; // pretty because it derives from A class D : public A{}; // not pretty even though it derives from A // default because conversion pointer-to-bool has lowest overload precedence std::false_type is_pretty_function(bool); // set the traits for A and D std::true_type is_pretty_function(A*); std::false_type is_pretty_function(D*); // use this struct to "read" the traits from the functions template<class T> struct trait { typedef decltype(is_pretty_function(std::declval<T*>())) is_pretty; }; int main() { std::cout << "A looks " << (trait<A>::is_pretty::value ? "pretty": "nice" )<<std::endl; std::cout << "B looks " << (trait<B>::is_pretty::value ? "pretty": "nice" )<<std::endl; std::cout << "C looks " << (trait<C>::is_pretty::value ? "pretty": "nice" )<<std::endl; std::cout << "D looks " << (trait<D>::is_pretty::value ? "pretty": "nice" )<<std::endl; return 0; }