<div dir="ltr"><div><div>When writing NIFs in C++, it is impossible to employ C++ function overloading because the underlying type of ERL_NIF_TERM is "unsigned int".  For example:<br><br></div>// won't compile :(<br>
</div>#include <erl_nif.h><br>void my_func(ERL_NIF_TERM a)  {...}<br>void my_func(unsigned int a)  {...}<br><br><br><div><div><div>This patch allows NIF authors to mutate the type of ERL_NIF_TERM by defining the macro CUSTOM_NIF_TERM_TYPE().  In the example below, the underlying unsigned integer type gets wrapped as a C++11 typed enumeration.  The type of ERL_NIF_TERM is now unique and can be used in overloaded functions.<br>
<br></div><div>// compiles!  :)<br></div><div>#define CUSTOM_NIF_TERM_TYPE(Type) enum class ERL_NIF_TERM : Type {};<br>#include <erl_nif.h><br>void my_func(ERL_NIF_TERM a)  {...}<br>void my_func(unsigned int a)  {...}<br>
<br><br></div><div>The patch has no impact on erl_nif.h if CUSTOM_NIF_TERM_TYPE is not defined (other than flipping the definition order of ERL_NIF_TERM and ERL_NIF_UINT).<br><br></div><div>A similar approach has been used on my C++11 NIF wrapper (<a href="https://github.com/goertzenator/nifpp">https://github.com/goertzenator/nifpp</a>).  The wrapper requires manual installation of a similar patch, and I would love to remove that requirement.<br>
<br></div>Regards,<br>Dan.<br></div></div></div>