<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.19258"></HEAD>
<BODY 
style="WORD-WRAP: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space">
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>Great, thanks Brad.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>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</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>template&lt; typename T &gt;<BR>typename EnableIfC&lt; IsSame&lt; 
T, ScalarDerivativeType &gt;::Value, T &gt;::Type<BR>EnableIfTest(int 
val)<BR>{<BR>&nbsp; std::cout &lt;&lt; "Output == ScalarDerivativeType. val " 
&lt;&lt; val &lt;&lt; "\n" &lt;&lt; std::endl;<BR>&nbsp; T o;<BR>&nbsp; 
o.Fill(1);<BR>&nbsp; return o;<BR>}<BR></FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>(and similarly with DisableIfC...)</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>&nbsp;</DIV></FONT></SPAN>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>In implementation:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>&nbsp; OutputType r;<BR></FONT></SPAN><SPAN 
class=656050320-22082012><FONT size=2 face=Verdana>&nbsp; r = 
this-&gt;EnableIfTest(3);<BR></FONT></DIV>
<DIV></SPAN><SPAN class=656050320-22082012><FONT size=2 face=Verdana>I think 
I'll skip this for now because I have a working implementation and the extra 
overhead it has, because&nbsp;it requires a nested function call, is only a few 
%.</FONT></SPAN></DIV>
<DIV><SPAN class=656050320-22082012><FONT size=2 
face=Verdana></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=656050320-22082012><FONT size=2 face=Verdana>I'll put up a 
patch soon and hopefully you could take a look at it, Brad. I'll let you 
know.</FONT></SPAN></DIV>
<DIV><SPAN class=656050320-22082012><FONT size=2 
face=Verdana></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=656050320-22082012><FONT size=2 
face=Verdana>-M</FONT></SPAN></DIV>
<DIV><FONT size=2 face=Verdana></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Verdana></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Verdana></FONT>&nbsp;</DIV>
<DIV><BR></DIV>
<BLOCKQUOTE 
style="BORDER-LEFT: #000000 2px solid; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; MARGIN-RIGHT: 0px" 
dir=ltr>
  <DIV dir=ltr lang=en-us class=OutlookMessageHeader align=left>
  <HR tabIndex=-1>
  <FONT size=2 face=Tahoma><B>From:</B> Bradley Lowekamp 
  [mailto:blowekamp@mail.nih.gov] <BR><B>Sent:</B> Tuesday, August 21, 2012 3:37 
  PM<BR><B>To:</B> Michael Stauffer<BR><B>Cc:</B> 
  Insight-developers@itk.org<BR><B>Subject:</B> Re: [Insight-developers] 
  Overloading methods<BR></FONT><BR></DIV>
  <DIV></DIV>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; FONT-SIZE: 12px; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space"><SPAN 
  style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto" 
  class=Apple-style-span>
  <P style="MARGIN: 0px"><FONT style="FONT: 12px Helvetica" size=3 
  face=Helvetica>========================================================</FONT></P>
  <P style="MARGIN: 0px"><FONT style="FONT: 12px Helvetica" size=3 
  face=Helvetica>Bradley Lowekamp<SPAN 
  class=Apple-converted-space>&nbsp;</SPAN><SPAN 
  class=Apple-converted-space>&nbsp;</SPAN></FONT></P>
  <P style="MARGIN: 0px"><FONT style="FONT: 12px Helvetica" size=3 
  face=Helvetica>Medical Science and Computing for</FONT></P>
  <P style="MARGIN: 0px"><FONT style="FONT: 12px Helvetica" size=3 
  face=Helvetica>Office of High Performance Computing and 
  Communications</FONT></P>
  <P style="MARGIN: 0px"><FONT style="FONT: 12px Helvetica" size=3 
  face=Helvetica>National Library of Medicine<SPAN 
  class=Apple-converted-space>&nbsp;</SPAN></FONT></P>
  <P style="MARGIN: 0px"><FONT style="FONT: 12px Helvetica" size=3 
  face=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></BLOCKQUOTE></BODY></HTML>