Boost logo

Boost :

Subject: Re: [boost] arithmetic meta functions and traits
From: joel falcou (joel.falcou_at_[hidden])
Date: 2009-12-06 04:19:32

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()

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

Boost list run by bdawes at, gregod at, cpdaniel at, john at