Hello Michael,
Here is the declaration of one of the GetComponent methods:
template< typename T>
typename EnableIfC<
IsSame<T, typename NumericTraits<T>::ValueType>::Value,
T >::Type
GetComponent(const T pix,
unsigned int itkNotUsed( idx ) ) const;
This uses the EnableIf idom to answer lets look at a simplification of function:
template< typename T> T GetComponent(const T pix, unsigned int idx ) const;
So I just simplified it some. So for function C++ has the ability to implicitly
deduce the template parameters from the arguments passed to a function. So if
you did the following:
int i;
GetComponent( i, 10 )
C++ can deduce the template parameter T, based on the function argument i being
of type int.
There are a couple C++ tricks to overloading functions that should be
considered before the EnableIf idiom should be considered. Using the EnableIf
idom is really a last resort when simpler more understandable techniques can
not be used.
Brad
On Aug 17, 2012, at 6:17 PM, Michael Stauffer wrote:
> I'm using the new EnableIfC and DisableIfC routines, to try and optimize
> itkCentralDifferenceImageFunction::Evaluate* methods by specializing for
> scalar and vector pixel types. I have it working using my own SFINAE method I
> pulled off the web. But this, requires calling templated subfunctions, which
> cost about 2% in overhead.
>
>
> Looking at itkEnableIf.h and its usage in PatchBasedDenoisingImageFilter, I
> was hoping to be able to call the specialized Evalute* methods directly.
>
>
> The method PatchBasedDenoisingImageFilter::GetComponent is are
> template-specialized to use one of two versions depending on whether the
> pixel is scalar or not. The method is templated.
> But in
> PatchBasedDenoisingImageFilter::ComputeSignedEuclideanDifferenceAndWeightedSquaredNorm(),
> GetComponent is called without any template parameters. How does this work?
> I must be missing something.
>
>
>
>
> template
> void
> PatchBasedDenoisingImageFilter
> ::ComputeSignedEuclideanDifferenceAndWeightedSquaredNorm(const PixelType& a,
> const PixelType& b,
> const RealArrayType& weight,
> bool itkNotUsed(useCachedComputations),
> SizeValueType itkNotUsed(cacheIndex),
> EigenValuesCacheType& itkNotUsed(eigenValsCache),
> EigenVectorsCacheType& itkNotUsed(eigenVecsCache),
> RealType& diff, RealArrayType& norm)
> {
> for (unsigned int pc = 0; pc < m_NumPixelComponents; ++pc)
> {
> RealValueType tmpDiff = GetComponent(b, pc) - GetComponent(a, pc);
> RealValueType tmpWeight = weight[pc];
> SetComponent(diff, pc, tmpDiff);
> norm[pc] = tmpWeight * tmpWeight * tmpDiff * tmpDiff;
> }
> }
>
========================================================
Bradley Lowekamp
Medical Science and Computing for
Office of High Performance Computing and Communications
National Library of Medicine
[email protected]
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php
Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers