<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Christoph Frick - ofnir.net - Open Source Consultant, Software Developer and System Administrator (Posts about Lua)</title><link>https://ofnir.net/</link><description></description><atom:link href="https://ofnir.net/categories/lua.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="mailto:cf@ofnir.net"&gt;Christoph Frick - ofnir.net&lt;/a&gt; </copyright><lastBuildDate>Sat, 13 Dec 2025 14:20:05 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Pass a Lua function to a std::function with Swig</title><link>https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/</link><dc:creator>Christoph Frick - ofnir.net</dc:creator><description>&lt;p&gt;Lets assume for sake of simplicity, a :c++:&lt;cite&gt;std::function&amp;lt;void()&amp;gt;&lt;/cite&gt;
written in Lua has to be passed down from your script back into your C++
engine.&lt;/p&gt;
&lt;p&gt;First be sure to place the &lt;code class="docutils literal"&gt;lua_fnptr&lt;/code&gt; module of Swig in your &lt;code class="docutils literal"&gt;.i&lt;/code&gt; file&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_ae6f21cc8be64259995cca86f6ff5e91-1" name="rest_code_ae6f21cc8be64259995cca86f6ff5e91-1" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_ae6f21cc8be64259995cca86f6ff5e91-1"&gt;&lt;/a&gt;%include "lua_fnptr.i"
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next provide a wrapper class&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code c++"&gt;&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-1" name="rest_code_c4d5041476104b1cbc02a198af9d910e-1" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;LuaFnPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-2" name="rest_code_c4d5041476104b1cbc02a198af9d910e-2" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-3" name="rest_code_c4d5041476104b1cbc02a198af9d910e-3" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;LuaFnPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SWIGLUA_REF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-4" name="rest_code_c4d5041476104b1cbc02a198af9d910e-4" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-5" name="rest_code_c4d5041476104b1cbc02a198af9d910e-5" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;swiglua_ref_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-6" name="rest_code_c4d5041476104b1cbc02a198af9d910e-6" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;lua_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-7" name="rest_code_c4d5041476104b1cbc02a198af9d910e-7" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-8" name="rest_code_c4d5041476104b1cbc02a198af9d910e-8" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-8"&gt;&lt;/a&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-9" name="rest_code_c4d5041476104b1cbc02a198af9d910e-9" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;SWIGLUA_REF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_c4d5041476104b1cbc02a198af9d910e-10" name="rest_code_c4d5041476104b1cbc02a198af9d910e-10" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_c4d5041476104b1cbc02a198af9d910e-10"&gt;&lt;/a&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now you can wrap some callback function right away, e.g.:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code c++"&gt;&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-1" name="rest_code_8e462ed885634c79b86d65e91f1539eb-1" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-1"&gt;&lt;/a&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SWIGLUA_REF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-2" name="rest_code_8e462ed885634c79b86d65e91f1539eb-2" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-3" name="rest_code_8e462ed885634c79b86d65e91f1539eb-3" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;LuaFnPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lua_fn_ptr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-4" name="rest_code_8e462ed885634c79b86d65e91f1539eb-4" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lua_fn_ptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-5" name="rest_code_8e462ed885634c79b86d65e91f1539eb-5" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-5"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-6" name="rest_code_8e462ed885634c79b86d65e91f1539eb-6" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_8e462ed885634c79b86d65e91f1539eb-7" name="rest_code_8e462ed885634c79b86d65e91f1539eb-7" href="https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/#rest_code_8e462ed885634c79b86d65e91f1539eb-7"&gt;&lt;/a&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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;function&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>C++</category><category>Lua</category><category>Swig</category><guid>https://ofnir.net/posts/pass-a-lua-function-to-a-stdfunction-with-swig/</guid><pubDate>Mon, 11 Feb 2013 23:00:00 GMT</pubDate></item></channel></rss>