Hello,

The reason you methods is not working is because C++ can't deduce the template 
parameters from the argument types passed to the function. That is to say since 
T is only used for the return type, and not as an argument to the function, so 
you should explicitly specify it as a template parameters. Something like this 
should work:

r = this->EnableIfTest<OutputType>( 3 );

Brad


On Aug 22, 2012, at 4:08 PM, M Stauffer -V- wrote:

> Great, thanks Brad.
>  
> I can reproduce what you explain below, but it's not working when I rely on 
> only the return parameter type for the template parameter deduction. That is, 
> the following won't compile
>  
> template< typename T >
> typename EnableIfC< IsSame< T, ScalarDerivativeType >::Value, T >::Type
> EnableIfTest(int val)
> {
>   std::cout << "Output == ScalarDerivativeType. val " << val << "\n" << 
> std::endl;
>   T o;
>   o.Fill(1);
>   return o;
> }
> (and similarly with DisableIfC...)
>  
> In implementation:
>  
>   OutputType r;
>   r = this->EnableIfTest(3);
> I think I'll skip this for now because I have a working implementation and 
> the extra overhead it has, because it requires a nested function call, is 
> only a few %.
>  
> I'll put up a patch soon and hopefully you could take a look at it, Brad. 
> I'll let you know.
>  
> -M
>  
>  
>  
> 
> From: Bradley Lowekamp [mailto:[email protected]] 
> Sent: Tuesday, August 21, 2012 3:37 PM
> To: Michael Stauffer
> Cc: [email protected]
> Subject: Re: [Insight-developers] Overloading methods
> 
> 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]
> 
> 
> 

========================================================
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

Reply via email to