<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div style="word-wrap:break-word">Hi Mark, Alex, Carolina
<div><br>
</div>
<div>Attached is a pretty comprehensive book on using template classes and template functions in C++.  Its a great way to fall asleep at night.</div>
<div><br>
</div>
<div>There is a lot of things you can do with templates, but from my naive perspective its a great way to reduce the need for function overloading and only have a single copy of the function to maintain.  The primary thing to remember is that the compiler will
 write the actual code that gets implemented; therefore, the function templates are usually found in the header file (.h or .htp, or .hpp).</div>
<div><br>
</div>
<div>One thing to be aware of is return types that differ from the types passed to the function arguments.  For example:</div>
<div><br>
</div>
<div>in the vonb.hpp file:</div>
<div><br>
</div>
<div>template<typename t1, typename t2></div>
<div>t1 vonB(const t1 age, const t2 linf, const t2, vonbk)</div>
<div>{</div>
<div><span class="x_Apple-tab-span" style="white-space:pre"></span>return(linf*(1.-exp(-vonbk*age)));</div>
<div>}</div>
<div><br>
</div>
<div><br>
</div>
<div>in your tpl file:</div>
<div><br>
</div>
<div>dvector age(1,5);</div>
<div>age.fill_seqadd(1,1);</div>
<div>dvar_vector len(1,5);</div>
<div>len = vonB(age,linf,vbk);</div>
<div><br>
</div>
<div>In this case, the function returns a dvector, but assigns it to a dvar_vector.  And this will be problematic.</div>
<div><br>
</div>
<div>Steve</div>
<div><br>
</div>
<div>
<div>
<div>On Jun 27, 2014, at 11:05 A</div>
</div>
</div>
</div>
<div style="word-wrap:break-word">
<div>
<div>
<div>M, Mark Maunder <<a href="mailto:mmaunder@iattc.org">mmaunder@iattc.org</a>> wrote:</div>
<br class="x_Apple-interchange-newline">
<blockquote type="cite">
<div lang="EN-US" style="font-family:Helvetica; font-size:18px; font-style:normal; font-variant:normal; font-weight:normal; letter-spacing:normal; line-height:normal; orphans:auto; text-align:start; text-indent:0px; text-transform:none; white-space:normal; widows:auto; word-spacing:0px">
<div class="x_WordSection1" style="">
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
Hi developers,</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
I am in the process or putting together a model that will be used to evaluate several growth equations so I thought I better try to use the ADMB project “approved” approach for writing the functions. Below is a template function and documentation for the von
 Bertalanffy growth equation. I would appreciate any advice on doing this “correctly”.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
Thanks,</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
Mark</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
/**</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
\defgroup CONTRIB Contributed libraries</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
*/</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
/**</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
\ingroup CONTRIB</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
\defgroup CAPAM CAPAM created functions</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
*/</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
#include <admodel.h></div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
/**  von Bertalanffy growth equation; constant objects.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \ingroup CAPAM</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \brief Calculate the length from a given age based on the von Bertalanffy equation. Written by Mark Maunder.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \param age age of individual, \f$a\f$.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \param Linf asymptotic length, \f$L_inf\f$.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \param K growth rate, \f$K\f$.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \param t0 age at zero length, \f$t_0\f$.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  \return length predicted length of individual. \f$L_inf*(1-exp(-K*(a-t0)))\f$.</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  */</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
template <typename type1, typename type1></div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//can have multiple types so that they are used below in variable definitions, they can differ between function calls, but remain the same within a function call</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//type1 is probably a long</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//type2 is probably a dvariable (either a model parameter (Linf K t0) or a derived variable (length))</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//may need a type3, which is a dvar_vector if age and length are vectors, where type 1 will be a vector</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
type1 vonB(const type1 &age, const type2 &Linf, const type2 &K, const type2 &t0)</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
{</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  type2 length = Linf*(1.-mfexp(-K*(age-t0)));</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
  return (length);</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
} </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//is length a bad word to use</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//do we use ingroup for both groups and subgroups in doxygen documentation</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//should we use mfexp?</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//what if age and length are vectors, but age is a vector and length is a dvar_vector, do we need to overload the type with one with three variable types</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//I couldn't work out how to put in the detailed description</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
//The equations did not work on my computer</div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
<div style="margin:0in 0in 0.0001pt; font-size:11pt; font-family:Calibri,sans-serif">
 </div>
</div>
_______________________________________________<br>
Developers mailing list<br>
<a href="mailto:Developers@admb-project.org" style="color:purple; text-decoration:underline">Developers@admb-project.org</a><br>
<a href="http://lists.admb-project.org/mailman/listinfo/developers" style="color:purple; text-decoration:underline">http://lists.admb-project.org/mailman/listinfo/developers</a></div>
</blockquote>
</div>
<br>
</div>
</div>
<br>
<hr>
<font face="Arial" color="Gray" size="1"><br>
This internet e-mail message, and any files transmitted with it, contains confidential, privileged information that is intended only for the addressee. If you have received this e-mail message in error, please call us at (206) 634-1838 collect if necessary)
 and ask to speak to the message sender. Nothing in this e-mail or the act of transmitting it, is to be construed as a waiver of any rights or privileges enjoyed by the sender or the International Pacific Halibut Commission pursuant to the International Organizations
 Immunities Act, 22 U.S.C. Sec. 288 et seq.<br>
</font>
</body>
</html>