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

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk