
Zachary Turner wrote:
The sizeof trick I'm aware of is comparing the size against an "unlikely" size N, something very large such as 43280 such that you're unlikely to come across two types P and Q such that sizeof(P()+Q()) == N. Is there any reason this method is preferable to the method I used above though, where it can provably never result in a false negative?
You get it wrong, that's not what we call the sizeof trick. Here is an example for checking for operator+: #include <boost/type_traits/remove_cv.hpp> #include <boost/static_assert.hpp> namespace detail { struct tag {}; struct any { template <class T> any(T const&); }; tag operator+(any const&, any const&); tag operator,(tag,int); char (& check(tag))[2]; template <class T> char check(T const&); template <class T> struct impl { static typename boost::remove_cv<T>::type& x; static const bool value = sizeof(check(((x + x),0))) == 1; }; } template <class T> struct is_addable : detail::impl<T> {}; struct A{}; int main() { BOOST_STATIC_ASSERT(is_addable<int>::value); BOOST_STATIC_ASSERT(!is_addable<A>::value); } And as I say, Frederic BRon already provided such traits in the upcoming type_traits revision I think -- ___________________________________________ Joel Falcou - Assistant Professor PARALL Team - LRI - Universite Paris Sud XI Tel : (+33)1 69 15 66 35