<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Josh Bialkowski (Posts about Programming)</title><link>https://www.joshbialkowski.com/</link><description></description><atom:link href="https://www.joshbialkowski.com/categories/programming.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2018 &lt;a href="mailto:josh.bialkowski@gmail.com"&gt;Josh Bialkowski&lt;/a&gt; 
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0"
 src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
This work is licensed under a
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;
Creative Commons Attribution-ShareAlike 4.0 International License&lt;/a&gt;.
</copyright><lastBuildDate>Tue, 20 Mar 2018 01:47:58 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Range Based for-loops in C++11</title><link>https://www.joshbialkowski.com/posts/2013/range-based-for-loops-in-c11.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;One of the new features of C++11 that is a complete win in my opinion is the
support for range-based for-loop syntax. Judicious use allows for
significantly more compact and readable code. However, one thing that is
lacking from this feature is the ability to iterate over a range of integers.
This isn't a problem, however, because it is very easy to implement.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;// This file compiles as a single unit, you can test it by saving it &lt;/span&gt;
&lt;span class="c1"&gt;// as range_for.cpp and compiling with &lt;/span&gt;
&lt;span class="c1"&gt;// g++ -std=c++11 -o range_for range_for.cpp&lt;/span&gt;
&lt;span class="c1"&gt;// Adjust the interface as you see fit&lt;/span&gt;

&lt;span class="c1"&gt;// Implementation (put this in a header)&lt;/span&gt;
&lt;span class="c1"&gt;// --------------------------------------------&lt;/span&gt;


&lt;span class="c1"&gt;/// encapsulates a range of integral numbers for use in a c++11 range-based for &lt;/span&gt;
&lt;span class="c1"&gt;/// loop&lt;/span&gt;
&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Range&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// the begin() and end() functions must return an iterator with a specific&lt;/span&gt;
    &lt;span class="c1"&gt;/// interface&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;///&amp;lt; storage for the actual value&lt;/span&gt;

        &lt;span class="c1"&gt;/// implicit construction from the value type&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;

        &lt;span class="c1"&gt;/// the range-based for loops attempt to dereference an iterator using&lt;/span&gt;
        &lt;span class="c1"&gt;/// this operator&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// the range-based for loops quit when the comparison of iter != end&lt;/span&gt;
        &lt;span class="c1"&gt;/// returns false&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// iterators in a range-based for loop must have the prefix increment&lt;/span&gt;
        &lt;span class="c1"&gt;/// operator&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// we likely want to implicitly convert to the value type&lt;/span&gt;
        &lt;span class="k"&gt;operator&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;m_begin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;///&amp;lt; the first integral value&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;m_end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;///&amp;lt; one past the last integral value&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;/// construct a range [begin, end)&lt;/span&gt;
        &lt;span class="n"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;m_begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;m_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;/// interface required by range-based for loop&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt; &lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m_begin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// interface required by range-based for loop&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m_end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="c1"&gt;/// return an object which can be used in a range-based for loop&lt;/span&gt;
&lt;span class="k"&gt;template&lt;/span&gt; 
&lt;span class="n"&gt;Range&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;




&lt;span class="c1"&gt;// Usage &lt;/span&gt;
&lt;span class="c1"&gt;// ---------------------------------------------&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; 

&lt;span class="cpf"&gt;int main(int argc, char** argv)&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Static ranges&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;----------------&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;int:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"   i: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;unsigned int:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"   i: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;long:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"   i: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Dynamic range (program args)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;----------------&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" : "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The &lt;code&gt;range&amp;lt;T&amp;gt;( T begin, T end )&lt;/code&gt; function template returns a &lt;code&gt;Range&amp;amp;ltT&amp;gt;&lt;/code&gt;
object which supports the required interface for range-based loops. It has a
&lt;code&gt;begin&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt; method, both of which return an iterator. The iterator has
the same storage says as the integral type used to instantiate the templates.
It is implicitly convertable to and from the integral type. Futhermore, it has
the prefix &lt;code&gt;++&lt;/code&gt; operator, and can be "dereferenced" to get the stored integral
value.&lt;/p&gt;
&lt;p&gt;The implementation is likely to yield compiled code equivalent to a normal for
loop.&lt;/p&gt;
&lt;p&gt;The output of the demo program above is:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;josh@Nadie:~/Desktop$ g++ -std=c++11 -o range_for range_for.cpp 
josh@Nadie:~/Desktop$ ./range_for arg1 arg2 arg3 arg4 arg5
Static ranges
-----------

int:
   i: 1
   i: 2
   i: 3
   i: 4

unsigned int:
   i: 1
   i: 2
   i: 3
   i: 4

long:
   i: 1
   i: 2
   i: 3
   i: 4

Dynamic range (program args)
-----------
0 : ./range_for
1 : arg1
2 : arg2
3 : arg3
4 : arg4
5 : arg5
josh@Nadie:~/Desktop$
&lt;/pre&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2013/range-based-for-loops-in-c11.html</guid><pubDate>Fri, 02 Aug 2013 14:07:04 GMT</pubDate></item><item><title>Exception Streams in C++</title><link>https://www.joshbialkowski.com/posts/2012/exception-streams-in-c.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;Here's a short but handy C++ Snippet. I was looking for a way to quickly
generate runtime exceptions with useful information about the current program
state. My process was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a string stream&lt;/li&gt;
&lt;li&gt;Build the message&lt;/li&gt;
&lt;li&gt;Throw the exception using the string from the stream&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I felt like this was particularly cumbersome and quite annoying, especially
for doing things like string parsing or SQL because there are a lot of places
in the code where error checking is required.&lt;/p&gt;
&lt;p&gt;In any case, I came up with this simple little class tempate which sits in a
single header file and is included in the cpp file where it is to be used.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#ifndef _UTILITY_EXCEPTIONSTREAM_H_&lt;/span&gt;
&lt;span class="cp"&gt;#define _UTILITY_EXCEPTIONSTREAM_H_&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; 
&lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;utility&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="c1"&gt;/// used to simplify the process of generating an exception message&lt;/span&gt;
&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  Derives from stringstream so provides an ostream interface, but throws&lt;/span&gt;
&lt;span class="cm"&gt; *  an exception with the contents of the string when the object is destroyed&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; *  \tparam Exception_t must be an exception type which accepts a&lt;/span&gt;
&lt;span class="cm"&gt; *                      const char* in it's constructor&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="k"&gt;template&lt;/span&gt; 
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExceptionStream&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stringstream&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;ExceptionStream&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;Exception_t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ostream&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;ExceptionStream&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="cm"&gt;/* namespace utility */&lt;/span&gt;
&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* EXCEPTIONSTREAM_H_ */&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Usage is like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt; &lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;fExp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;evalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;m_expression&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"radius"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;subs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;iRadius&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;is_a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ex_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;to_double&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;utility&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"GiNaC failed to parse radius expression: "&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Here I'm using GiNaC to parse a string into a mathematical expression. If the
process fails I want to throw a runtime exception (typedef'ed as utility::ex).&lt;/p&gt;
&lt;p&gt;The class derives from string stream so it works just like a string stream…
building a string by catting together the RHS of all the string operators. The
magic is that the destructor for the class throws an exception. The message
for the exception is the string that was built.&lt;/p&gt;
&lt;p&gt;It's a very handy time saver… though I'm not sure if it's actually safe to
use. If the destructor throws an exception, is the object memory still freed?&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2012/exception-streams-in-c.html</guid><pubDate>Sat, 02 Jun 2012 15:37:27 GMT</pubDate></item><item><title>directoryWatch</title><link>https://www.joshbialkowski.com/posts/2011/directorywatch.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;As I was working on texmake I decided that I didn't want to figure out what
all the possible auxilary output files would be for a latex document. Also,
I'm suspecting that it will depend on what packages are included and things.
Anyway, I wanted a way to just monitor the build directory and see all the
files that were created while running latex. It turns out this is very easy on
linux. This is a very simple program which watches a directory, and will print
out any files that are created, modified, opened, closed, moved, or deleted.
It prints out the file name, followed by a comma, followed by the notification
event.&lt;/p&gt;
&lt;p&gt;You can find the code on 
&lt;a href="https://github.com/cheshirekow/directory_watch"&gt;github&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description><category>Programming</category><category>Projects</category><guid>https://www.joshbialkowski.com/posts/2011/directorywatch.html</guid><pubDate>Thu, 18 Aug 2011 20:17:44 GMT</pubDate></item><item><title>HTML Documentation with Equation Numbers (Referencing an External PDF Document with Doxygen's HTML Documentation)</title><link>https://www.joshbialkowski.com/posts/2010/html-documentation-with-equation-numbers-referencing-an-external-pdf-document-with-doxygens-html-documentation.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;So, anyone who uses Doxygen to document their code knows that it's pretty much
the most amazing thing ever. Seriously, it's awesome. One cool thing about it
is the ability to reference external documentation. For instance, if you use a
library in your code and you want to include the library's documentation with
your own. However, let's say that (hypothetically of course) you're an
academic… and the code you write implements some theoretical design or model.
In that case, you may actually want your documentation to reference a paper,
or a report that you've written. Perhaps, even many such papers or reports.&lt;/p&gt;
&lt;h4&gt;The Problem&lt;/h4&gt;
&lt;p&gt;In particular, let's say that you're a grad student, in the process of writing
a paper (and of course, you used LaTex… because, well, why wouldn't you?) and
you go and write some code to simulate or demonstrate some elements of that
paper. In that case, some of your functions may implement certain equations.
Some of your classes (if it's object oriented) may implement certain models.
For an example, lets say this is your paper:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://www.joshbialkowski.com/posts/2010/wp-content/manual/01/dummy.png"&gt;&lt;/p&gt;
&lt;p&gt;Let's also assume that you've been good, and have been documenting your code
with Doxygen. Let's say you had some c++ class that implemented your model and
it's definition looks something like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  file       CTheoreticalModel.h&lt;/span&gt;
&lt;span class="cm"&gt; *  author     Joe Author (jauthor@institute.edu)&lt;/span&gt;
&lt;span class="cm"&gt; *  date       Apr 17, 2010&lt;/span&gt;
&lt;span class="cm"&gt; *  brief      Definition file for CTheoreticalModel class&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ifndef&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;


&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  brief  Theoretical Model derived in section 2, on page 1&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; *  This is a detailed description of the model&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_alpha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation 2.1&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation 2.2&lt;/span&gt;

    &lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      Construct a new model using the given parameters&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  alpha   [parameter] defined in equation 2.1&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  beta    [parameter] defined in equation 2.2&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;beta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      calculates [some property] by implementing algorithm 2.1&lt;/span&gt;
&lt;span class="cm"&gt;         *              on page 1&lt;/span&gt;
&lt;span class="cm"&gt;         *  return     [some property]&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;algorithmA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      updates the model by [some parameter] according to the&lt;/span&gt;
&lt;span class="cm"&gt;         *              dynamics of equation 2.4&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  gamma   [parameter] defined in equation 2.3&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;equationB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;gamma&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      tests [some parameter] against the model; implements&lt;/span&gt;
&lt;span class="cm"&gt;         *              equation 2.6&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  theta   [some parameter] defined by equation 2.5&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nx"&gt;testC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;theta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;endif&lt;/span&gt; &lt;span class="cm"&gt;/* CTHEORETICALMODEL_H_ */&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Then the html documentation that doxygen will generate will look like this:&lt;/p&gt;
&lt;p&gt;Now let's say that you talk to your advisor and he suggests that maybe section
2 should come after section 3. Moreover, you add a bunch of content to section
1 so now all of the code for this model is on page five. So then you end up
with this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://www.joshbialkowski.com/posts/2010/wp-content/manual/01/dummy2.png"&gt;&lt;/p&gt;
&lt;p&gt;So now you have to go back and change all of the equation numbers and page
references in your code. But wait, when we wrote our document we "&lt;code&gt;label{}&lt;/code&gt;"ed
all of our equations, algorithms, and sections. Wouldn't it be cool if we
could just reference those in the comments? Doxygen exposes latex's math mode
for us to document inline equations. It uses latex to render the equations,
and then uses dvipng to turn those into png images. Moreover, latex has the
&lt;code&gt;xr&lt;/code&gt; package, which allows us to reference labels from other documents.
Lastly, the "&lt;code&gt;ref{}&lt;/code&gt;" command is valid inside math-mode. So we have all the
tools we need, but there is one slight problem. In order to use the &lt;code&gt;xr&lt;/code&gt; latex
package, we need to include the "&lt;code&gt;externaldocument&lt;/code&gt;" command in the header of
the document.&lt;/p&gt;
&lt;h4&gt;The solution&lt;/h4&gt;
&lt;p&gt;Now here's the fun part. When Doxygen renders all of the equations, it does so
by generating a single latex source file called "&lt;code&gt;_formulas.tex&lt;/code&gt;". We don't
have explicit access to modify the preamble of that source file, but we are
allowed to add optional packages to the list of what is included. We do that
by modifying the "&lt;code&gt;EXTRA_PACKAGES&lt;/code&gt;" line of the doxyfile. For instance, if we
edit the doxyfile like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;…
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
# packages that should be included in the LaTeX output.

EXTRA_PACKAGES = amsmath xr amsfonts
…
&lt;/pre&gt;


&lt;p&gt;then when doxygen generates &lt;code&gt;_formulas.tex&lt;/code&gt; it will include in the preamble a
list of includes like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    usepackage{amsmath}
    usepackage{xr}
    usepackage{amsfonts}
&lt;/pre&gt;


&lt;p&gt;Note that Doxygen tokenizes the list of packages (parses it) at whitespace,
and then takes each token and wraps it with "usepackage{}", inserting it into
the header. We can hijack this method of input by making &lt;code&gt;EXTRA_PACKAGES&lt;/code&gt;
variable like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;…
EXTRA_PACKAGES = amsmath xr}externaldocument[paper-]{dummy}% amsfonts
…
&lt;/pre&gt;


&lt;p&gt;Then the preamble of &lt;code&gt;_formulas.tex&lt;/code&gt; will look like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    usepackage{amsmath}
    usepackage{amsfonts}
    usepackage{xr}externaldocument[paper-]{dummy}%}
    usepackage{hyperref}
&lt;/pre&gt;


&lt;p&gt;Note how we use a comment character (percent) to comment out the closing
bracket that doxygen put's around our 'package'. Now we have an extra command
in our preamble. If you haven't looked up the &lt;code&gt;xr&lt;/code&gt; documentation yet, this
command means to look for a file called "&lt;code&gt;dummy.aux&lt;/code&gt;" generated by latex. The
package extracts all the labels from that file and appends "&lt;code&gt;paper-&lt;/code&gt;" to the
front of the label names. Now we can change our code documentation to look
like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  file       CTheoreticalModel.h&lt;/span&gt;
&lt;span class="cm"&gt; *  author     Joe Author (jauthor@institute.edu)&lt;/span&gt;
&lt;span class="cm"&gt; *  date       Apr 17, 2010&lt;/span&gt;
&lt;span class="cm"&gt; *  brief      Definition file for CTheoreticalModel class&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ifndef&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;


&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  brief  Theoretical Model derived in section f$ref{paper-sec:Model}f$,&lt;/span&gt;
&lt;span class="cm"&gt; *          page f$pageref{paper-sec:Model}f$&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; *  This is a detailed description of the model&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_alpha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation f$ref{paper-eqn:alphaDef}f$&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation f$ref{paper-eqn:betaDef}f$&lt;/span&gt;

    &lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      Construct a new model using the given parameters&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  alpha   [parameter] defined in equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:alphaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  beta    [parameter] defined in equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:betaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;beta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      calculates [some property] by implementing algorithm&lt;/span&gt;
&lt;span class="cm"&gt;         *              f$ref{paper-alg:SomeAlgorithm}f$ on page&lt;/span&gt;
&lt;span class="cm"&gt;         *              f$pageref{paper-alg:SomeAlgorithm}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  return     [some property]&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;algorithmA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      updates the model by [some parameter] according to the&lt;/span&gt;
&lt;span class="cm"&gt;         *              dynamics of equation f$ref{paper-eqn:SomeEquation}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *              on page f$pageref{paper-eqn:SomeEquation}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  gamma   [parameter] defined in equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:gammaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;equationB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;gamma&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      tests [some parameter] against the model; implements&lt;/span&gt;
&lt;span class="cm"&gt;         *              condition f$ref{paper-eqn:SomeCondition}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  theta   [some parameter] defined by equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:thetaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nx"&gt;testC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;theta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;endif&lt;/span&gt; &lt;span class="cm"&gt;/* CTHEORETICALMODEL_H_ */&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Now all we have to do is dump &lt;code&gt;dummy.aux&lt;/code&gt; (generated when we build the paper
using latex) into the &lt;code&gt;html&lt;/code&gt; directory where doxygen is going to build
&lt;code&gt;_formulas.tex&lt;/code&gt; and then when we make the documentation it looks like this:&lt;/p&gt;
&lt;p&gt;Sure, all the references are images… which isn't particularly great, but it's
a lot better than having to go in and change the labels every time we make a
change to the referenced document. Whenever writing a code and a referenced
document are done in parallel, this could be quite a handy trick. If you want
the html document to look a little more professional, add a package that will
set the font to the same as the font set by your doxygen &lt;code&gt;CSS&lt;/code&gt; stylesheet.&lt;/p&gt;
&lt;p&gt;If you want to play around with the files used in this post, pick them up
here: &lt;a href="https://www.joshbialkowski.com/posts/2010/wp-content/manual/01/dummy.7z"&gt;dummy.7z&lt;/a&gt;. Create the latex document
with the following command.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;latex dummy.tex
&lt;/pre&gt;


&lt;p&gt;Then copy &lt;code&gt;dummy.aux&lt;/code&gt; into the &lt;code&gt;html&lt;/code&gt; directory.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;cp dummy.aux html/
&lt;/pre&gt;


&lt;p&gt;Then run doxygen&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;doxygen doxyfile
&lt;/pre&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Java Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2010/html-documentation-with-equation-numbers-referencing-an-external-pdf-document-with-doxygens-html-documentation.html</guid><pubDate>Sat, 17 Apr 2010 20:17:44 GMT</pubDate></item><item><title>Instanciate Objects of Unknown Type from Their Parent Interface</title><link>https://www.joshbialkowski.com/posts/2009/instanciate-objects-of-unknown-type-from-their-parent-interface.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;This is based on my previous two posts on 
&lt;a href="https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html"&gt;Static Interfaces in C++&lt;/a&gt; and 
&lt;a href="https://www.joshbialkowski.com/posts/static-interfaces-in-c.html"&gt;Keep Track of and Enumerate All Sub-classes of a Particular Interface&lt;/a&gt;. 
The idea is that I want my code to be extensible in the feature without requiring
any re-writing of the current code base. The code base operates on generic
objects via their interfaces, so as long as newly-coded classes properly
extend those interfaces, the program should know how to handle them. The
problem is, how can we write the program in such a manner that a user
interface can enumerate available options for implementations of a particular
interface, and how can we instantiate those objects?&lt;/p&gt;
&lt;p&gt;In 
&lt;a href="https://www.joshbialkowski.com/posts/static-interfaces-in-c.html"&gt;Keep Track of and Enumerate All Sub-classes of a Particular Interface&lt;/a&gt; 
I showed how to maintain a
registry of classes deriving from a given interface, which handles the first
problem, but there is a limitation in that all of these classes must provide a
factory method that takes no parameters (void input). I decided that, for my
project, this was not acceptable and I needed a way to define the creation
parameters as part of the factory methods, whereas the creation parameters may
be different for particular interfaces.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html"&gt;Static Interfaces in C++&lt;/a&gt; 
I showed how we can enforce the
requirement of a static method in derived classes with a particular signature
using a template interface.&lt;/p&gt;
&lt;p&gt;In this post I will combine the two so that we can create a registry of
classes that inherit from a particular interface, and provide a static factory
method for creating objects of that interface, using a particular creation
method signature unique to that interface. The registry will pair class names
with function pointers that match the specific signature of the interface the
class is being registered for.&lt;/p&gt;
&lt;p&gt;Disclaimer: I do not claim this is the "best" way to handle this issue. This
is just what I came up with. It happens to be pretty involved and overly
indirect, which means it's probably bad design. It is, however, an extremely
interesting exercise in generic programming.&lt;/p&gt;
&lt;p&gt;Prequil: the code will require these later so there they are:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  file          RegistryTest.cpp&lt;/span&gt;
&lt;span class="cm"&gt;     *  date:      Aug 14, 2009&lt;/span&gt;
&lt;span class="cm"&gt;     *  brief:&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *  detail:&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;


    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Ok, so lets begin. First let's define a couple of interfaces that we're
interested in.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterfaceA&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterfaceB&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterfaceC&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Now we create a template class whose sole purpose is to create a per-interface
&lt;code&gt;typedef&lt;/code&gt; of the function signature that is necessary for instantiating and
object of that class. Is it really possible that all sub-objects can be
instantiated with the same parameters? If that's the case, shouldn't they all
be combined into a single class that just contains that information as private
members? Probably, but in my case these parameters are more like a "bare
minimum" for instantiation, and then many more parameters are set by the user.
It makes sense to me, I promise. If it doesn't to you, you don't have to use
this.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;Creator&lt;/code&gt; is now a &lt;code&gt;typedef&lt;/code&gt; that aliases a function pointer that takes no
parameters. Wait, isn't that what we had before? Yes, but now we make a couple
of template specializations to define the different signatures for our
specific interfaces. These specializations would normally be in the file that
contained the interface declaration.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="c1"&gt;/// specializations can define other creators, this one requires an int&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;/// specializations can define other creators, this one requires an int, a&lt;/span&gt;
    &lt;span class="c1"&gt;/// bool, and a char&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Cool. Now we create a static interface that enforces it's derivative classes
to contain a static method called &lt;code&gt;createNew&lt;/code&gt; which can be used to instantiate
a new object of that interface. We can use the typedef we just created to make
the function signature generic for this template (or specific to individual
instantiations of it).&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ClassType&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Still following? Good. Now we define the registry class template, which maps
the class name of a derived class to a function pointer with an interface-
specific signature that serves as a static factory for objects of the derived
class, returning a pointer to that object of the type of the interface. See my
previous post for details on this class.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Registry&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


            &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="p"&gt;(){}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;  &lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


            &lt;span class="k"&gt;typename&lt;/span&gt;
            &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;
            &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;



    &lt;span class="c1"&gt;// A convient macro to compact the registration of a class&lt;/span&gt;
    &lt;span class="cp"&gt;#define RegisterWithInterface( CLASS, INTERFACE )                   &lt;/span&gt;
    &lt;span class="k"&gt;namespace&lt;/span&gt;                                                           
    &lt;span class="p"&gt;{&lt;/span&gt;                                                                   
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;dummy_&lt;/span&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;                                          
        &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;     
                &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createNew&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;                               
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;    &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;  &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;typename&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="k"&gt;typename&lt;/span&gt;
    &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;
    &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The difference between this and the Registry in my previous post, is that this
time the registry uses the generic &lt;code&gt;Factory&amp;lt;InterfaceType&amp;gt;::Creator&lt;/code&gt; typedef
to define the function pointer. This way, that pointer is forced to have the
specific signature. Sweet!&lt;/p&gt;
&lt;p&gt;Now lets write some derived classes of those interfaces.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt;   &lt;span class="nc"&gt;DerivedA&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;


    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DerivedA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;



    &lt;span class="k"&gt;class&lt;/span&gt;   &lt;span class="nc"&gt;DerivedB&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;


    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DerivedB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;



    &lt;span class="k"&gt;class&lt;/span&gt;   &lt;span class="nc"&gt;DerivedC&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DerivedC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;These classes are basically dummies, but inheriting from &lt;code&gt;IStaticFactory…&lt;/code&gt; the
compiler will enforce that they contain the static method &lt;code&gt;createNew&lt;/code&gt; with the
proper signature. Notice that &lt;code&gt;InterfaceA&lt;/code&gt; uses the default template so the
static factory in &lt;code&gt;DerivedA&lt;/code&gt; takes no parameters, while &lt;code&gt;InterfaceB&lt;/code&gt; and
&lt;code&gt;InterfaceC&lt;/code&gt; have specializations so the static factories in &lt;code&gt;DerivedB&lt;/code&gt; and
&lt;code&gt;DerivedC&lt;/code&gt; have their respective parameters. Since this is just an example,
the methods don't actually create new objects they just return pointers, but
in reality this is where we would use &lt;code&gt;new DerivedA(…)&lt;/code&gt; and so on.&lt;/p&gt;
&lt;p&gt;Well that's it. Pretty cool huh? The compiler will enforce all this stuff for
us so we can actually say to ourselves when we write new implementations
months from now "If it compiles, it will be compatible."&lt;/p&gt;
&lt;p&gt;Lastly, here's a little test case to run&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DerivedA&lt;/span&gt;    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DerivedB&lt;/span&gt;    &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DerivedC&lt;/span&gt;    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;makesObjectOfA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DerivedA"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;makesObjectOfA&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;

        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;makesObjectOfB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DerivedB"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;makesObjectOfB&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;makesObjectOfC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DerivedC"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;makesObjectOfC&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"pA: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pA&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"pB: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pB&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"pC: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pC&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;&lt;img alt="Output of the Test Program" src="https://www.joshbialkowski.com/wordpress/wp-content/uploads/2009/08/registry2.jpg"&gt;&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2009/instanciate-objects-of-unknown-type-from-their-parent-interface.html</guid><pubDate>Fri, 14 Aug 2009 19:13:36 GMT</pubDate></item><item><title>Static Interfaces in C++</title><link>https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;I remember looking around a few weeks ago for how to make a "static interface"
in c++. Basically, I wanted a way to use the compiler to enforce that a class
had certain static functions. Almost all of the internet resources I found
basically said "Why would you ever want to do that; you don't really want to
do that; you probably have bad design" and so on… continuously begging the
question. Of course, they were right: the design was bad and that wasn't
really what I wanted to do. Well, never the less, I still managed to think of
a way to create a sort of static interface using a template class.&lt;/p&gt;
&lt;p&gt;The strategy is to define a template class that uses the static methods of the
template parameter class. That way, as long as the template is instantiated,
the compiler will complain unless we have provided those static functions. We
can ensure that the template is instantiated and enforce the inheritance idea
by making the derived class extend from the template class we wrote to enforce
those static methods.&lt;/p&gt;
&lt;p&gt;Here is an example. We can create the static interface by declaring a class
template that uses the functions we want to enforce as part of the interface.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StaticInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;StaticInterface&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fooCheck&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;barCheck&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;By assigning &lt;code&gt;T::foo&lt;/code&gt; and &lt;code&gt;T::bar&lt;/code&gt; to function pointers, we are saying,
implicitly, that whatever class is provided as a parameter to this template
must have a static method called &lt;code&gt;foo&lt;/code&gt; and a static method called &lt;code&gt;bar&lt;/code&gt; and,
furthermore, that those static methods must have&lt;br&gt;
the same signature as the function pointers we stuff them into.&lt;/p&gt;
&lt;p&gt;By putting this code inside the constructor of the class, we know that this
method of the template will be instantiated, even if we don't explicitly use
it later in the code, as long as we derive from this class somewhere. So then,
the last question is, where can we derive from it?&lt;/p&gt;
&lt;p&gt;Well, in the class that we want to inherit the interface of course!&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DerivedClass&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;StaticInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;  &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The &lt;code&gt;DerivedClass&lt;/code&gt; constructor implicitly calls the &lt;code&gt;StaticInterface&lt;/code&gt;
constructor, which assigns the function pointers &lt;code&gt;fooCheck&lt;/code&gt; and &lt;code&gt;barCheck&lt;/code&gt; to
the address of the functions &lt;code&gt;DerivedClass::foo&lt;/code&gt; and &lt;code&gt;DerivedClass::bar&lt;/code&gt;. As a
result, if we forget the &lt;code&gt;bar&lt;/code&gt; function in the &lt;code&gt;DerivedClass&lt;/code&gt; the compiler
will choke with an error. g++ says the following:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;src/poc/test/StaticInterfaceTest.cpp: In constructor
`StaticInterface::StaticInterface() [with T = DerivedClass]':  
src/poc/test/StaticInterfaceTest.cpp:41: instantiated from here  
src/poc/test/StaticInterfaceTest.cpp:20: error: `bar' is not a member of
`DerivedClass'
&lt;/pre&gt;


&lt;p&gt;Pretty cool huh?&lt;/p&gt;
&lt;p&gt;As a final note, please consider this "an interesting observation" and not
necessarily a "great design choice". As I said, I decided against actually
trying to utilize this idea in my project, and I urge you think carefully
before about yours before trying to use it yourself.&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html</guid><pubDate>Thu, 13 Aug 2009 15:09:12 GMT</pubDate></item><item><title>Keep Track of and Enumerate All Sub-classes of a Particular Interface</title><link>https://www.joshbialkowski.com/posts/2009/keep-track-of-and-enumerate-all-sub-classes-of-a-particular-interface.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;Here's another interesting C++ problem I encountered today. As is often the
case, I found my answer by asking over at Stack Overflow. The question can be
found here: &lt;a href="http://stackoverflow.com/questions/1260954/how-can-i-keep-track-%0Aof-enumerate-all-classes-that-implement-an-interface"&gt;http://stackoverflow.com/questions/1260954/how-can-i-keep-track-
of-enumerate-all-classes-that-implement-an-interface&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The issue was that I was writing a simulation program where I knew I would
eventually want to simulate multiple different vehicles, with multiple
different controllers, and multiple different estimators. Naturally, this led
me to define an interface for each of these things, but the problem was that I
only really want to implement a few subclasses of these interfaces now. In
particular, I only have two vehicles, 2 controllers, and 1 estimator I'm
interested in completing now, but I will probably want to implement at least 2
more vehicles, 2 more controllers, and 2 or 3 more estimators. And, finally,
as far as the simulation is designed, I would like for the user to be able to
select from a list of choices which vehicle, which controller, and which
estimator to use. Therefore, I was looking for a clean way to keep a kind of
registry of classes that implement each of these interfaces so that I wouldn't
have to go back and change the interface code later when I implemented more
sub-classes.&lt;/p&gt;
&lt;p&gt;The solution that was accepted was to implement a registry class that
maintains a mapping of class-names to constructors, and then update that
mapping from within the class definition file from each of the implementing
sub-classes using a static initializer. I went one step further and made the
registry class generic (templated), and this is the result. There is an
example code below.&lt;/p&gt;
&lt;p&gt;File: CInterfaceRegistry.h&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  file        CInterfaceRegistry.h&lt;/span&gt;
&lt;span class="cm"&gt;     *  date:      Aug 11, 2009&lt;/span&gt;
&lt;span class="cm"&gt;     *  brief:&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *  detail:&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;

    &lt;span class="cp"&gt;#ifndef CINTERFACEREGISTRY_H_&lt;/span&gt;
    &lt;span class="cp"&gt;#define CINTERFACEREGISTRY_H_&lt;/span&gt;

    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

    &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"exception/IllegalArgumentException.h"&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

    &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;utility&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;


    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  brief  Generic singleton object to maintains a registry of subclasses&lt;/span&gt;
&lt;span class="cm"&gt;     *          that implement a particular interface&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *  This clever solution was taken from the discussion at the following site:&lt;/span&gt;
&lt;span class="cm"&gt;     *  http://stackoverflow.com/questions/1260954/how-can-i-enumerate-all-&lt;/span&gt;
&lt;span class="cm"&gt;     *  classes-that-implement-an-interface&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *  note:   The registry will allow the registration of any class that extends&lt;/span&gt;
&lt;span class="cm"&gt;     *          an interface so long as it has a factory method, but the&lt;/span&gt;
&lt;span class="cm"&gt;     *          RegisterWithInterface macro will only work with classes that have&lt;/span&gt;
&lt;span class="cm"&gt;     *          named that method create()&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CInterfaceRegistry&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


            &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;             *  brief  private to ensure that only the singleton ( the single&lt;/span&gt;
&lt;span class="cm"&gt;             *          static instantiation ) of this template class is used&lt;/span&gt;
&lt;span class="cm"&gt;             */&lt;/span&gt;
            &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="p"&gt;(){}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

            &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;             *  brief  returns the registry instance particular to the specified&lt;/span&gt;
&lt;span class="cm"&gt;             *          interface (specified as template parameter)&lt;/span&gt;
&lt;span class="cm"&gt;             */&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


            &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;             *  brief  registers a new subclass of a an interface&lt;/span&gt;
&lt;span class="cm"&gt;             */&lt;/span&gt;
            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


            &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;             *  brief  registers a new subclass from it's typeid() result, rather&lt;/span&gt;
&lt;span class="cm"&gt;             *          than from a hand-typed class name&lt;/span&gt;
&lt;span class="cm"&gt;             */&lt;/span&gt;
            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;type_info&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;classType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


            &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;             *  brief  returns a list of classes registered with this interface&lt;/span&gt;
&lt;span class="cm"&gt;             */&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;  &lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


            &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;             *  brief  returns a new object of the specified class&lt;/span&gt;
&lt;span class="cm"&gt;             */&lt;/span&gt;
            &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="nf"&gt;createObjectOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;};&lt;/span&gt;





    &lt;span class="c1"&gt;// A convient macro to compact the registration of a class&lt;/span&gt;
    &lt;span class="cp"&gt;#define RegisterWithInterface( CLASS, INTERFACE )                   &lt;/span&gt;
    &lt;span class="k"&gt;namespace&lt;/span&gt;                                                           
    &lt;span class="p"&gt;{&lt;/span&gt;                                                                   
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;dummy_&lt;/span&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;                                          
        &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;     
                &lt;span class="k"&gt;typeid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;                         
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  The use of this method ensures that this template class remains singleton.&lt;/span&gt;
&lt;span class="cm"&gt;     *  Only the static registry object created by this method will exist for any&lt;/span&gt;
&lt;span class="cm"&gt;     *  instantiation of this class.&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;    &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  To register a class with this registry, we map a factory function that is&lt;/span&gt;
&lt;span class="cm"&gt;     *  capable of generating objects of the class and returning a pointer of the&lt;/span&gt;
&lt;span class="cm"&gt;     *  interface type. The key we map it to is the name of the class.&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  For added convenience, we can avoid typing the class names by hand if we&lt;/span&gt;
&lt;span class="cm"&gt;     *  use the typeid() operator. This method will extract the class name from&lt;/span&gt;
&lt;span class="cm"&gt;     *  a type_info class and pass it on to the actual registration method.&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
                            &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;type_info&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;classType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  To generate a list of the class names currently registered with this&lt;/span&gt;
&lt;span class="cm"&gt;     *  interface, we iterate through the map and extract all the keys.&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;  &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;typename&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  To create a new object of the specified class, we simply de-reference the&lt;/span&gt;
&lt;span class="cm"&gt;     *  stored factory method and execute it.&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createObjectOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"is not registered with the registry"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* CINTERFACEREGISTRY_H_ */&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;File: CInterfaceRegistryTest.cpp&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  file        CInterfaceRegistryTest.cpp&lt;/span&gt;
&lt;span class="cm"&gt;     *  date:      Aug 11, 2009&lt;/span&gt;
&lt;span class="cm"&gt;     *  brief:&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *  detail:&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;

    &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"utility/CInterfaceRegistry.h"&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
    &lt;span class="cp"&gt;#include&lt;/span&gt; 

    &lt;span class="cpf"&gt;using namespace utility;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;



    &lt;span class="c1"&gt;// create the interface that we will be extending&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IDummyInterface&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;


    &lt;span class="c1"&gt;// create the first of several implementations of that interface&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CDerivedA&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;// the class must have some kind of static factory method&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CDerivedA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// and this is how we register the class with the registry&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;dummyA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
            &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"CDerivedA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CDerivedA&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


    &lt;span class="c1"&gt;// we create, here, the second of several implementations, it's basically the&lt;/span&gt;
    &lt;span class="c1"&gt;// same as the first&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CDerivedB&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;// again with the static factory method&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CDerivedB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// this is the same as above&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;dummyB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
            &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"CDerivedB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CDerivedB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


    &lt;span class="c1"&gt;// and a nother implementation&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CDerivedC&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;// ditto…&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CDerivedC&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// this time we use that convenient macro that does things a little more&lt;/span&gt;
    &lt;span class="c1"&gt;// compactly and, I think, without sacrificing readabilty&lt;/span&gt;
    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CDerivedC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IDummyInterface&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;



    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// here we can retrieve a list of all the registered classes by&lt;/span&gt;
        &lt;span class="c1"&gt;// querying the registry object&lt;/span&gt;
        &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;CInterfaceRegistry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Currently registered subclasses of IDummyInterface: n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"----------------------nn"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt;   &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"nndonen"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;&lt;img alt="Screen Capture of the test program" src="https://www.joshbialkowski.com/wordpress/wp-content/uploads/2009/08/registry.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Note that the name returned by querying &lt;code&gt;typeid()&lt;/code&gt; has a "9″ inserted in the
front of it. The names used to identify a type in the &lt;code&gt;type_info&lt;/code&gt; class are
implementation specific, so it may or may not be a good idea to use them. In
my case it will be fine.&lt;/p&gt;
&lt;p&gt;Edit:&lt;br&gt;
A better choice for the macro is to use something like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="c1"&gt;// A convient macro to compact the registration of a class&lt;/span&gt;
    &lt;span class="cp"&gt;#define RegisterWithInterface( CLASS, INTERFACE )                   &lt;/span&gt;
    &lt;span class="k"&gt;namespace&lt;/span&gt;                                                           
    &lt;span class="p"&gt;{&lt;/span&gt;                                                                   
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;dummy_&lt;/span&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;                                          
        &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;     
                &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createNew&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;                               
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;which uses the class's name from the source code instead of the &lt;code&gt;type_info&lt;/code&gt;
name.&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2009/keep-track-of-and-enumerate-all-sub-classes-of-a-particular-interface.html</guid><pubDate>Tue, 11 Aug 2009 15:57:26 GMT</pubDate></item><item><title>In-Place Matrix Transpose</title><link>https://www.joshbialkowski.com/posts/2009/in-place-matrix-transpose.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;I was looking around today for an algorithm for In-Place Matrix Transposition
and didn't manage to find anything, so this is what I came up with. I'll
analyze and document it fully later, but I just wanted to get it down.&lt;/p&gt;
&lt;p&gt;It's wasteful in that it will repeat a lot of operations, especially for
"thin" matrices (worst case: vector). But it will work, never-the-less. Worst
case run time is at most $latex O(n^2)$ where $latex n$ is the size of the
matrix $latex n = rows times columns$&lt;/p&gt;
&lt;p&gt;Edit: No longer arbitrarily repeating cycles ( was leading to identity
operation, duh! ).&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;CMatrix&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;inPlaceTranspose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k_new&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;T&lt;/span&gt;       &lt;span class="n"&gt;temp&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="kt"&gt;bool&lt;/span&gt;    &lt;span class="n"&gt;abort&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;k_new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// go through the cycle once and ensure that the starting point is&lt;/span&gt;
            &lt;span class="c1"&gt;// minimal&lt;/span&gt;
            &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;k_new&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;abort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;

                &lt;span class="n"&gt;k&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k_new&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;j&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;k_new&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k_new&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


            &lt;span class="c1"&gt;// if the current value is not the minimum of the cycle, then don't&lt;/span&gt;
            &lt;span class="c1"&gt;// perform the cycle&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


            &lt;span class="c1"&gt;// otherwise, perform the cycle&lt;/span&gt;
            &lt;span class="n"&gt;k_new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k_new&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

                &lt;span class="n"&gt;k&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k_new&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;j&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;k_new&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k_new&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;k_start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="n"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k_new&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;And the result:&lt;br&gt;
&lt;img alt="In Place Transpose" src="https://www.joshbialkowski.com/wordpress/wp-content/uploads/2009/07/transpose.jpg"&gt;&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>mathjax</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2009/in-place-matrix-transpose.html</guid><pubDate>Tue, 28 Jul 2009 11:07:16 GMT</pubDate></item></channel></rss>