[erlang-patches] customized ERL_NIF_TERM type support

Daniel Goertzen <>
Fri Feb 7 18:34:14 CET 2014

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:

// won't compile :(
#include <erl_nif.h>
void my_func(ERL_NIF_TERM a)  {...}
void my_func(unsigned int a)  {...}

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.

// compiles!  :)
#define CUSTOM_NIF_TERM_TYPE(Type) enum class ERL_NIF_TERM : Type {};
#include <erl_nif.h>
void my_func(ERL_NIF_TERM a)  {...}
void my_func(unsigned int a)  {...}

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).

A similar approach has been used on my C++11 NIF wrapper (
https://github.com/goertzenator/nifpp).  The wrapper requires manual
installation of a similar patch, and I would love to remove that

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20140207/4dbb28c9/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: custom_erl_nif_term.patch
Type: text/x-patch
Size: 889 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20140207/4dbb28c9/attachment.bin>

More information about the erlang-patches mailing list