<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hello Michael,<div><br></div><div>Here is the declaration of one of the GetComponent methods:</div><div><br></div><div><div>template&lt; typename T&gt;</div><div>&nbsp; &nbsp; typename EnableIfC&lt;</div><div>&nbsp; &nbsp; &nbsp; IsSame&lt;T, typename NumericTraits&lt;T&gt;::ValueType&gt;::Value,</div><div>&nbsp; &nbsp; &nbsp; T &gt;::Type</div><div>&nbsp; GetComponent(const T pix,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unsigned int itkNotUsed( idx ) ) const;</div></div><div><br></div><div>This uses the EnableIf idom to answer lets look at a simplification of function:</div><div><br></div><div><div>template&lt; typename T&gt;&nbsp; T&nbsp;GetComponent(const T pix,&nbsp;&nbsp;unsigned int idx ) const;</div></div><div><br></div><div>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:</div><div><br></div><div>int i;</div><div>GetComponent( i, 10 )</div><div><br></div><div>C++ can deduce the template parameter T, based on the function argument i being of type int.</div><div><br></div><div><br></div><div>There are a couple &nbsp;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.</div><div><br></div><div><br></div><div>Brad</div><div><br><div><div>On Aug 17, 2012, at 6:17 PM, Michael Stauffer wrote:</div><blockquote type="cite"><div>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.<br><br></div></blockquote><blockquote type="cite"><div><br>Looking at itkEnableIf.h and its usage in PatchBasedDenoisingImageFilter, I was hoping to be able to call the specialized Evalute* methods directly.<br><br><br>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.<br>But in PatchBasedDenoisingImageFilter::ComputeSignedEuclideanDifferenceAndWeightedSquaredNorm(), GetComponent is called without any template parameters. How does this work? I must be missing something.<br><br><br><br><br>template <br>void<br>PatchBasedDenoisingImageFilter<br>::ComputeSignedEuclideanDifferenceAndWeightedSquaredNorm(const PixelType&amp; a, const PixelType&amp; b,<br> const RealArrayType&amp; weight,<br> bool itkNotUsed(useCachedComputations),<br> SizeValueType itkNotUsed(cacheIndex),<br> EigenValuesCacheType&amp; itkNotUsed(eigenValsCache),<br> EigenVectorsCacheType&amp; itkNotUsed(eigenVecsCache),<br> RealType&amp; diff, RealArrayType&amp; norm)<br>{<br> for (unsigned int pc = 0; pc &lt; m_NumPixelComponents; ++pc)<br> {<br> RealValueType tmpDiff = GetComponent(b, pc) - GetComponent(a, pc);<br> RealValueType tmpWeight = weight[pc];<br> SetComponent(diff, pc, tmpDiff);<br> norm[pc] = tmpWeight * tmpWeight * tmpDiff * tmpDiff;<br> }<br>}<br><br></div></blockquote></div><br><div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-size: 12px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">========================================================</font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">Bradley Lowekamp<span class="Apple-converted-space">&nbsp;</span><span class="Apple-converted-space">&nbsp;</span></font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">Medical Science and Computing for</font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">Office of High Performance Computing and Communications</font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">National Library of Medicine<span class="Apple-converted-space">&nbsp;</span></font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; "><a href="mailto:blowekamp@mail.nih.gov">blowekamp@mail.nih.gov</a></font></p><br class="Apple-interchange-newline"></span></div><br class="Apple-interchange-newline">
</div>
<br></div></body></html>