Re: Can you specialize the Template operator==
* 3DCoderGuy:
I'm trying to specialize the operator== for my template, here is my code
#define DOUBLE_EPSILON (1e-6)
#define FLOAT_EPSILON (1e-4f)
bool const operator==(const XYZPoint<T> &xyzTest) const
{
return (
(x == xyzTest.x) &&
(y == xyzTest.y) &&
(z == xyzTest.z)
);
};
template<typename T>
bool const operator==(const XYZPoint<float> &xyzTest) const
{
return (
(x - xyzTest.x < FLOAT_EPSILON) && (x - xyzTest.x > -FLOAT_EPSILON) &&
(y - xyzTest.y < FLOAT_EPSILON) && (y - xyzTest.y > -FLOAT_EPSILON) &&
(z - xyzTest.z < FLOAT_EPSILON) && (z - xyzTest.z > -FLOAT_EPSILON)
);
}
template<typename T>
bool const operator==(const XYZPoint<double> &xyzTest) const
{
return (
(x - xyzTest.x < DOUBLE_EPSILON) && (x - xyzTest.x > -DOUBLE_EPSILON) &&
(y - xyzTest.y < DOUBLE_EPSILON) && (y - xyzTest.y > -DOUBLE_EPSILON) &&
(z - xyzTest.z < DOUBLE_EPSILON) && (z - xyzTest.z > -DOUBLE_EPSILON)
);
}
But when I do this
XYZPoint<double> pnt1(1.0,0.0,1.0);
XYZPoint<double> pnt2(1.0,0.0,2.0);
if (pnt1 == pnt2)
{
...
}
the specialization for <double> is never called.
Can this be done, and what would be the correct syntax?
Others have remarked on syntax etc.
However, if you really want to do this epsilon thing (note: it means you lose
the important property that a==b && b==c implies a==c, which means it's really
not a good idea, at least as long as you pretend that it's '==' equality), then
I suggest you pick up the relevant epsilon from a template:
<code>
template< typename T >
struct EpsilonFor
{
static T const value;
};
template<>
float const EpsilonFor<float>::value = 1.e-4f;
template<>
double const EpsilonFor<double>::value = 1.e-6;
template< typename FloatType >
bool isNearEqual( FloatType a, FloatType b )
{
return (std::abs( a - b ) <= EpsilonFor<FloatType>::value);
}
</code>
Cheers, & hth.,
- Alf
PS: Are you aware of std::numeric_limits? If not, take a look.
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?