Yes, thanks. It works when I explicitly pass the template parameter. But in my case I don't want to have to do that because I'm modifying CentralDifferenceImageFunction::Evaluate* methods, which doesn't seem like a good method to change if not absolutely necessary. -M
_____ From: Bradley Lowekamp [mailto:[email protected]] Sent: Thursday, August 23, 2012 8:22 AM To: M Stauffer -V- Cc: [email protected] Subject: Re: [Insight-developers] Overloading methods 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::ComputeSignedEuclideanDifferenceAndWeigh tedSquaredNorm(), 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
