Anyway, I&#39;ve updated autoCall(), so now you can pass arguments like usual but also specify the names of any ref/out variables that will be created. It will also check to make sure the number of arguments matches for the call to the function. Of course, arguments have to be evaluable at compile time (You can&#39;t just pass a string, it has to be immutable). Here&#39;s the code:<br>
<br>import std.file;        // getTimes()<br>import std.conv;        // to!string()<br>import std.traits;      // Parameter types, storage, introspection<br><br>import std.stdio;<br><br>// Notes:<br>//  Currently it only works with simple built-in types:<br>
//    Integrals, strings, but not objects.<br>//<br>//  It will throw a compiler error and a message if there are unmatched<br>//  number of arguments for the call to func().<br>//  Arguments have to be evaluable at compile time.<br>
auto autoCall(alias func, T...)(T args)<br>{<br>    alias ParameterStorageClass STC;                // storage class enum<br>    alias ParameterTypeTuple!(func) paramTypes;          // types of parameters<br>    alias ParameterStorageClassTuple!(func) storageTypes; // storage class of parameters<br>
    <br><br>    static if (paramTypes.length != args.length)<br>    {<br>        pragma(msg, &quot;autoCall: Template Error: Unmatched number of arguments for call to &quot; ~ __traits(identifier, func) ~ &quot;()&quot;);<br>
        static assert(0);<br>    }<br>    <br>    string declString, callString;<br>    <br>    // eg: callString = &quot;funcName(&quot;<br>    callString = __traits(identifier, func) ~ &quot;(&quot;;<br>    <br>    foreach (int i, storageType; storageTypes)<br>
    {<br>        if (storageType == STC.OUT || storageType == STC.REF)<br>        {<br>            // eg: declString ~= &quot;int newParamName; &quot;<br>            declString ~= paramTypes[i].stringof ~ &quot; &quot; ~ args[i] ~ &quot;; &quot;;<br>
            <br>            // eg: callString = &quot;funcName(&quot; ~ &quot;newParamName,&quot;<br>            callString ~= &quot; &quot; ~ args[i] ~ &quot;,&quot;;<br>        }<br>        else<br>        {<br>            // Fetch the value of args or args[i] and expand it to callString.<br>
            // We cannot use the actual names of the arguments since that would<br>            // not work with literals (unless we added tests and more branching)<br>            <br>            // need to use static if here due to array bounds checking<br>
            static if (args.length == 1)<br>            {<br>                // eg: callString = &quot;funcName(args, newParamName,&quot;<br>                callString ~= &#39;&quot;&#39; ~ to!string(args) ~ &#39;&quot;&#39; ~ &quot;,&quot;;<br>
            }<br>            else<br>            {<br>                // eg: callString = &quot;funcName(args[i], newParamName,&quot;<br>                callString ~= &#39;&quot;&#39; ~ to!string(args[i]) ~ &#39;&quot;&#39; ~ &quot;,&quot;;<br>
            }<br>        }<br>    }<br>    <br>    // remove the extra comma and close the call string<br>    callString = callString[0 .. $ - 1] ~ &quot;);&quot;;<br><br>    // return joined strings ready to be used with mixin()<br>
    return declString ~= callString;<br>}<br><br>void testMe(string x, ref int z, string y)<br>{<br>    writeln(x, y);<br>    z = 5;<br>}<br><br>unittest<br>{    <br>    immutable string var1 = &quot;foo&quot;;<br>    immutable string var2 = &quot;bar&quot;;<br>
    <br>    mixin(autoCall!(testMe)(var1, &quot;newvar&quot;, var2));<br>    assert(newvar == 5);<br>}<br><br>void main() { }<br><br>Fun stuff, right? :p<br><br><div class="gmail_quote">On Sat, Aug 7, 2010 at 9:57 PM, Andrej Mitrovic <span dir="ltr">&lt;<a href="mailto:andrej.mitrovich@gmail.com">andrej.mitrovich@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Cool stuff! I&#39;ll have a look later. Thanks.<div><div></div><div class="h5"><br><br><div class="gmail_quote">
On Sat, Aug 7, 2010 at 9:53 PM, Nick Sabalausky <span dir="ltr">&lt;a@a.a&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

&quot;Andrej Mitrovic&quot; &lt;<a href="mailto:andrej.mitrovich@gmail.com" target="_blank">andrej.mitrovich@gmail.com</a>&gt; wrote in message<br>
news:mailman.175.1281208901.13841.digitalmars-d@puremagic.com...<br>
<div>&gt; You know, I just had an idea. It would be really cool to have some sort of<br>
&gt; generalized template function which can test other functions in various<br>
&gt; ways. You could pass strings as options, where you might choose the type<br>
&gt; of<br>
&gt; testing being done, such as verification tests or performance tests.. Or<br>
&gt; if<br>
&gt; a function is designed to write a file on disk, maybe you&#39;d want to have<br>
&gt; an<br>
&gt; option for the maximum number of tests to run on that function (you don&#39;t<br>
&gt; want to be left with 10000 files written in some temp directory<br>
&gt; somewhere..), or a test to see if a function will fail with invalid input,<br>
&gt; etc.<br>
&gt;<br>
&gt; Well it&#39;s just an idea, I better take a look at the existing test<br>
&gt; frameworks<br>
&gt; and see how it&#39;s done there.<br>
&gt;<br>
<br>
</div>Probably not quite as fancy as what you&#39;re talking about, but my SemiTwist D<br>
Tools library has a module that includes something that&#39;s similar to assert<br>
but:<br>
<br>
- Allows to you verify that a particular statement throws a particular type<br>
of exception.<br>
- Properly reports if an expression throws (and you didn&#39;t expect it to).<br>
- Doesn&#39;t abort the program on failure.<br>
- Reports &quot;expected&quot; expression and &quot;actual&quot; value.<br>
<br>
<a href="http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/apps/tests/deferAssertTest/main.d" target="_blank">http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/apps/tests/deferAssertTest/main.d</a><br>


<a href="http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/util/deferAssert.d" target="_blank">http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/util/deferAssert.d</a><br>
<br>
It does need some clean-up and improvements, but it at least works.<br>
(Although, trunk is currently in the process of switching from D1/Tango to<br>
D2/Phobos, so the latest revisions might be broken and it definitely doesn&#39;t<br>
take advantage of D2-specific features yet. But the version included with<br>
Goldie 0.3 does work fine on D1/Tango though).<br>
<br>
<br>
</blockquote></div><br>
</div></div></blockquote></div><br>