<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body dir="auto">
<div>The Soln Dave points to is the most robust. You would have to overload the template function to accommodate all of the possible combinations otherwise. I have an example of traits I can send you when I get back to my mac. <br>
<br>
Sent from my iPad</div>
<div><br>
On Jun 27, 2014, at 1:43 PM, "dave fournier" <<a href="mailto:davef@otter-rsch.com">davef@otter-rsch.com</a>> wrote:<br>
<br>
</div>
<blockquote type="cite">
<div>
<div class="moz-cite-prefix">On 06/27/2014 01:38 PM, Mark Maunder wrote:<br>
<br>
see the concept traits in the template book. It is the way to deal with this.<br>
</div>
<blockquote type="cite"><style>
<!--
@font-face
{font-family:Helvetica}
@font-face
{font-family:"Cambria Math"}
@font-face
{font-family:Calibri}
@font-face
{font-family:Tahoma}
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif"}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{margin:0in;
margin-bottom:.0001pt;
font-size:8.0pt;
font-family:"Tahoma","sans-serif"}
span.apple-converted-space
{}
span.BalloonTextChar
{font-family:"Tahoma","sans-serif"}
span.EmailStyle20
{font-family:"Calibri","sans-serif";
color:#1F497D}
.MsoChpDefault
{font-size:10.0pt}
@page WordSection1
{margin:1.0in 1.0in 1.0in 1.0in}
div.WordSection1
{}
-->
</style>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D">But that would mean the user has to know how to call the function in this special way, which is probably asking too much.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D">Wouldn’t simply specifying the return type as being different from the argument work? And the compiler would work out t1 from the definition of len?</span></p>
<p class="MsoNormal">len = vonB(age,linf,k,ro);</p>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
<p class="MsoNormal">template<typename t1, typename t2, typename t3></p>
<p class="MsoNormal">t1 vonB(const t2 age, const t3 linf, const t3 k,const t3 to)<span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
<div>
<div style="border:none; border-top:solid #B5C4DF
1.0pt; padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt; font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt; font-family:"Tahoma","sans-serif""> Steve Martell [<a class="moz-txt-link-freetext" href="mailto:SteveM@iphc.int">mailto:SteveM@iphc.int</a>]
<br>
<b>Sent:</b> Friday, June 27, 2014 1:31 PM<br>
<b>To:</b> Mark Maunder<br>
<b>Cc:</b> <a class="moz-txt-link-abbreviated" href="mailto:developers@admb-project.org">
developers@admb-project.org</a>; Alexandre Aires-Da-Silva; Carolina Minte-Vera; Sean Patrick Cox<br>
<b>Subject:</b> Re: [Developers] Template functions and documentation</span></p>
</div>
</div>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Sorry I pulled the send trigger to quickly, the baby woke up!
</p>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">What I was getting at is when you have function that returns a type that is not passed as one of the arguments. You can still use a template function but when you call it, you have to specify what the return type is. eg</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">len = vonB<dvar_vector>(age,linf,k,ro);</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">In this case you would write the template as:</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">template<typename t1, typename t2, typename t3></p>
</div>
<div>
<p class="MsoNormal">t1 vonB(const t2 age, const t3 linf, const t3 k,const t3 to)</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">Steve</p>
</div>
<div>
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal">On Jun 27, 2014, at 12:19 PM, Mark Maunder <<a href="mailto:mmaunder@iattc.org">mmaunder@iattc.org</a>> wrote:</p>
</div>
<p class="MsoNormal"><br>
<br>
</p>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D">Steve,</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
</div>
<div>
<p class="MsoNormal">Re: In this case, the function returns a dvector, but assigns it to a dvar_vector. </p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">Yes, I recognize this. I think this can be solved by overloading the template with an explicit type for the return variable or making the return variable a third type.</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">Mark</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"; color:#1F497D"> </span></p>
</div>
<div>
<div style="border:none; border-top:solid #B5C4DF
1.0pt; padding:3.0pt 0in 0in 0in">
<div>
<p class="MsoNormal"><b><span style="font-size:10.0pt; font-family:"Tahoma","sans-serif"">From:</span></b><span class="apple-converted-space"><span style="font-size:10.0pt; font-family:"Tahoma","sans-serif""> </span></span><span style="font-size:10.0pt; font-family:"Tahoma","sans-serif"">Steve
Martell [<a href="mailto:SteveM@iphc.int"><span style="color:purple">mailto:SteveM@iphc.int</span></a>]<span class="apple-converted-space"> </span><br>
<b>Sent:</b><span class="apple-converted-space"> </span>Friday, June 27, 2014 11:31 AM<br>
<b>To:</b><span class="apple-converted-space"> </span>Mark Maunder<br>
<b>Cc:</b><span class="apple-converted-space"> </span><a href="mailto:developers@admb-project.org"><span style="color:purple">developers@admb-project.org</span></a>; Alexandre Aires-Da-Silva; Carolina Minte-Vera; Sean Patrick Cox<br>
<b>Subject:</b><span class="apple-converted-space"> </span>Re: [Developers] Template functions and documentation</span></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<div>
<p class="MsoNormal">Hi Mark, Alex, Carolina</p>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Attached is a pretty comprehensive book on using template classes and template functions in C++. Its a great way to fall asleep at night.</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">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).</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">One thing to be aware of is return types that differ from the types passed to the function arguments. For example:</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">in the vonb.hpp file:</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">template<typename t1, typename t2></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">t1 vonB(const t1 age, const t2 linf, const t2, vonbk)</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">{</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">return(linf*(1.-exp(-vonbk*age)));</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">}</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">in your tpl file:</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">dvector age(1,5);</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">age.fill_seqadd(1,1);</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">dvar_vector len(1,5);</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">len = vonB(age,linf,vbk);</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">In this case, the function returns a dvector, but assigns it to a dvar_vector. And this will be problematic.</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Steve</p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">On Jun 27, 2014, at 11:05 A</p>
</div>
</div>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">M, Mark Maunder <<a href="mailto:mmaunder@iattc.org"><span style="color:purple">mmaunder@iattc.org</span></a>> wrote:</p>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> </p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">Hi developers,</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; 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”.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">Thanks,</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">Mark</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">/**</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">\defgroup CONTRIB Contributed libraries</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">*/</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">/**</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">\ingroup CONTRIB</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">\defgroup CAPAM CAPAM created functions</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">*/</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">#include <admodel.h></span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">/** von Bertalanffy growth equation; constant objects.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \ingroup CAPAM</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \brief Calculate the length from a given age based on the von Bertalanffy equation. Written by Mark Maunder.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \param age age of individual, \f$a\f$.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \param Linf asymptotic length, \f$L_inf\f$.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \param K growth rate, \f$K\f$.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \param t0 age at zero length, \f$t_0\f$.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> \return length predicted length of individual. \f$L_inf*(1-exp(-K*(a-t0)))\f$.</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> */</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">template <typename type1, typename type1></span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; 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</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//type1 is probably a long</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//type2 is probably a dvariable (either a model parameter (Linf K t0) or a derived variable (length))</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; 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</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">type1 vonB(const type1 &age, const type2 &Linf, const type2 &K, const type2 &t0)</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">{</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> type2 length = Linf*(1.-mfexp(-K*(age-t0)));</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> return (length);</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">} </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//is length a bad word to use</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//do we use ingroup for both groups and subgroups in doxygen documentation</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//should we use mfexp?</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; 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</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//I couldn't work out how to put in the detailed description</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif"">//The equations did not work on my computer</span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt; font-family:"Calibri","sans-serif""> </span></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:13.5pt; font-family:"Helvetica","sans-serif"">_______________________________________________<br>
Developers mailing list<br>
<a href="mailto:Developers@admb-project.org"><span style="color:purple">Developers@admb-project.org</span></a><br>
<a href="http://lists.admb-project.org/mailman/listinfo/developers"><span style="color:purple">http://lists.admb-project.org/mailman/listinfo/developers</span></a></span></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div class="MsoNormal" align="center" style="text-align:center">
<hr align="center" size="3" width="100%">
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt; font-family:"Arial","sans-serif"; color:gray"><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.</span></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"> </p>
</div>
<p class="MsoNormal"> </p>
<div class="MsoNormal" align="center" style="text-align:center">
<hr align="center" size="3" width="100%">
</div>
<p class="MsoNormal"><span style="font-size:7.5pt; font-family:"Arial","sans-serif"; color:gray"><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.</span></p>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset> <br>
<pre>_______________________________________________
Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Developers@admb-project.org">Developers@admb-project.org</a>
<a class="moz-txt-link-freetext" href="http://lists.admb-project.org/mailman/listinfo/developers">http://lists.admb-project.org/mailman/listinfo/developers</a>
</pre>
</blockquote>
<br>
</div>
</blockquote>
<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>