Boost C++ Libraries: Ticket #9479: polymorphic_get<> for variant https://svn.boost.org/trac10/ticket/9479 <p> The original idea was described <a class="ext-link" href="http://coliru.stacked-crooked.com/a/3e920faa604fa534"><span class="icon">​</span>here</a>: </p> <pre class="wiki">#include &lt;iostream&gt; #include &lt;boost/variant.hpp&gt; #include &lt;boost/variant/get.hpp&gt; //------------------------------------------------------------------------------ struct unused { template&lt;class T&gt; unused(T&amp;) {} }; template&lt;class T&gt; struct Getter { typedef T* result_type; T* operator()(T&amp; v) const { return &amp;v; } T* operator()(unused) const { return nullptr; } }; template&lt;class U, class T&gt; U* poly_get(T* v) { return boost::apply_visitor(Getter&lt;U&gt;(), *v); } //------------------------------------------------------------------------------ struct O{ }; struct A:O{ }; struct B:O{ }; int main(int argc, char** argv) { boost::variant&lt;A, B&gt; v; std::cout &lt;&lt; "boost::get-------------------------------\n"; std::cout &lt;&lt; boost::get&lt;O&gt;(&amp;v) &lt;&lt; std::endl; std::cout &lt;&lt; boost::get&lt;A&gt;(&amp;v) &lt;&lt; std::endl; std::cout &lt;&lt; boost::get&lt;B&gt;(&amp;v) &lt;&lt; std::endl; std::cout &lt;&lt; "poly_get---------------------------------\n"; std::cout &lt;&lt; poly_get&lt;O&gt;(&amp;v) &lt;&lt; std::endl; std::cout &lt;&lt; poly_get&lt;A&gt;(&amp;v) &lt;&lt; std::endl; std::cout &lt;&lt; poly_get&lt;B&gt;(&amp;v) &lt;&lt; std::endl; } </pre> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/9479 Trac 1.4.3 Antony Polukhin Tue, 10 Dec 2013 12:19:02 GMT <link>https://svn.boost.org/trac10/ticket/9479#comment:1 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9479#comment:1</guid> <description> <p> In <a class="ext-link" href="https://github.com/boostorg/variant/commit/464799f4463f2aa28849f353d4c46be48d1d1f74"><span class="icon">​</span>git-commit</a> added docs, tests and implementation of <code>polymorphic_get</code> method. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Antony Polukhin</dc:creator> <pubDate>Tue, 10 Dec 2013 12:19:11 GMT</pubDate> <title>status changed https://svn.boost.org/trac10/ticket/9479#comment:2 https://svn.boost.org/trac10/ticket/9479#comment:2 <ul> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">assigned</span> </li> </ul> Ticket Antony Polukhin Wed, 05 Feb 2014 11:45:21 GMT status, milestone changed; resolution set https://svn.boost.org/trac10/ticket/9479#comment:3 https://svn.boost.org/trac10/ticket/9479#comment:3 <ul> <li><strong>status</strong> <span class="trac-field-old">assigned</span> → <span class="trac-field-new">closed</span> </li> <li><strong>resolution</strong> → <span class="trac-field-new">fixed</span> </li> <li><strong>milestone</strong> <span class="trac-field-old">To Be Determined</span> → <span class="trac-field-new">Boost 1.56.0</span> </li> </ul> <p> <a class="ext-link" href="https://github.com/boostorg/variant/commit/01a9630c375decceadc123caa686c801c7734a9f"><span class="icon">​</span>Merged to release branch</a> </p> Ticket