|
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