On 10/16/07, David Abrahams
on Sat Oct 13 2007, "Peng Yu"
wrote: On 10/13/07, John Maddock
wrote: Peng Yu wrote:
Hi,
Suppose I define a class fixed_point as
class fixed_point{ ....some operations are defined here
private: int _integer_part; unsigned _fractional_part }
I want is_arithmetic
::type to be true_ The aim of is_arithmetic is that it returns true only for built-in arithmetic types: in other words it's a type introspection tool. If you specialise it for UDT's you will very likely break other code (for example has_trivial_XXX assumes that all arithmetic types have trivial construct/asign/copy/destroy operations). Probably the correct traits to be specialising (and using to detect "numbers") is std::numeric_limits.
Unfortunately, there are not types that contain constants in std::numeric_limits as in the boost type_traits library. If I want do metaprogramming based the types, I can not used numeric_limits. You have a point that specialize is_arithmetic might break other code. But are there any other walk around for this problem of adding user defined types?
Yes.
template <class T> struct my_is_arithmetic : boost::is_arithmetic<T> {};
now use my_is_arithmetic and specialize it for fixed_point.
I assume that you suggest me to use my_is_arithmetic in the library
class. However, my question was that I do not have the freedom to
change the library (as discussed in the later message in this thread,
dated Oct 16, 2007 11:20 AM). The following code shows the fact.
#include