diff --git a/docs/source/api/overload.rst b/docs/source/api/overload.rst index 399b409d..f6319558 100644 --- a/docs/source/api/overload.rst +++ b/docs/source/api/overload.rst @@ -3,7 +3,14 @@ overload calling different functions based on argument number/type --------------------------------------------------------- -this function helps users make overloaded functions that can be called from Lua using 1 name but multiple arguments. It is meant to replace the spaghetti of code whre users mock this up by doing strange if statemetns and switches on what version of a function to call based on `luaL_check{number/udata/string}`_. Its use is simple: whereever you can pass a function type to Lua, whether its on a :doc:`usertype` or if you are just setting any kind of function with ``set`` or ``set_function`` (for :doc:`table` or :doc:`state(_view)`), simply wrap up the functions you wish to be considered for overload resolution on one function like so: +This function helps users make overloaded functions that can be called from Lua using 1 name but multiple arguments. It is meant to replace the spaghetti of code whre users mock this up by doing strange if statements and switches on what version of a function to call based on `luaL_check{number/udata/string}`_. + +.. note:: + + Please note that default parameters in a function (e.g., ``int func(int a = 20)``) do not exist beyond C++'s compile-time fun. When that function gets bound or serialized into Lua's framework, it is bound as a function taking 1 argument, not 2 functions taking either 0 or 1 argument. If you want to achieve the same effect, then you need to use overloading and explicitly call the version of the function you want. There is no magic in C++ that allows me to retrieve default parameters and set this up automatically. + + +Its use is simple: whereever you can pass a function type to Lua, whether its on a :doc:`usertype` or if you are just setting any kind of function with ``set`` or ``set_function`` (for :doc:`table
` or :doc:`state(_view)`), simply wrap up the functions you wish to be considered for overload resolution on one function like so: .. code-block:: cpp diff --git a/docs/source/compilation.rst b/docs/source/compilation.rst index 22b894e7..d002d183 100644 --- a/docs/source/compilation.rst +++ b/docs/source/compilation.rst @@ -12,6 +12,8 @@ Here are some notes on achieving better compile-times without sacrificing too mu * When you bind lots of usertypes, put them all in a *single* translation unit (one C++ file) so that it is not recompiled multiple times over, only to be discarded later by the linker. - Remember that the usertype binding ends up being serialized into the Lua state, so you never need them to appear in a header and cause that same compilation overhead for every compiled unit in your project. +* Consider placing groups of bindings in multiple different translation units (multiple C++ source files) so that only part of the bindings are recompiled when you have to change the bindings. + - Avoid putting your bindings into headers: it *will* slow down your compilation * For extremely large usertypes, consider using :doc:`simple_usertype`. - It performs much more work at runtime rather than compile-time, and should still give comparative performance (but it loses out in some cases for variable bindings or when you bind all functions to a usertype). * If you are developing a shared library, restrict your overall surface area by specifically and explicitly marking functions as visible and exported and leaving everything else as hidden or invisible by default diff --git a/docs/source/safety.rst b/docs/source/safety.rst index 8499152a..972653d4 100644 --- a/docs/source/safety.rst +++ b/docs/source/safety.rst @@ -28,6 +28,8 @@ The *vast majority* of all users are going to want to work with :doc:`sol::safe_ If you find yourself crashing inside of ``sol::function``, try changing it to a ``sol::protected_function`` and seeing if the error codes and such help you find out what's going on. You can read more about the API on :doc:`the page itself`. +As a side note, binding functions with default parameters does not magically bind multiple versions of the function to be called with the default parameters. You must instead use :doc:`sol::overload`. + .. warning:: Do NOT save the return type of a :ref:`function_result` with ``auto``, as in ``auto numwoof = woof(20);``, and do NOT store it anywhere. See :ref:`here`. \ No newline at end of file diff --git a/docs/source/tutorial/all-the-things.rst b/docs/source/tutorial/all-the-things.rst index 3b764b8d..2bd39cf3 100644 --- a/docs/source/tutorial/all-the-things.rst +++ b/docs/source/tutorial/all-the-things.rst @@ -617,10 +617,10 @@ Some more advanced things you can do/read about: * :doc:`stack manipulation<../api/stack>` to safely play with the stack. You can also define customization points for ``stack::get``/``stack::check``/``stack::push`` for your type. * :doc:`make_reference/make_object convenience function<../api/make_reference>` to get the same benefits and conveniences as the low-level stack API but put into objects you can specify. * :doc:`stack references<../api/stack_reference>` to have zero-overhead Sol abstractions while not copying to the Lua registry. - * :doc:`unique usertype traits<../api/unique_usertype_traits>` allows you to specialize handle/RAII types from other frameworks, like boost, and Unreal, to work with Sol. + * :doc:`unique usertype traits<../api/unique_usertype_traits>` allows you to specialize handle/RAII types from other frameworks, like boost and Unreal, to work with Sol. * :doc:`variadic arguments<../api/variadic_args>` in functions with ``sol::variadic_args``. * :doc:`this_state<../api/this_state>` to get the current ``lua_State*``. - * :doc:`resolve<../api/resolve>` overloads in case you have overloaded functions; a cleaner casting utility. + * :doc:`resolve<../api/resolve>` overloads in case you have overloaded functions; a cleaner casting utility. You must use this to emulate default parameters. .. _a basic example: https://github.com/ThePhD/sol2/blob/develop/examples/usertype.cpp .. _special functions: https://github.com/ThePhD/sol2/blob/develop/examples/usertype_special_functions.cpp diff --git a/docs/source/tutorial/functions.rst b/docs/source/tutorial/functions.rst index 5fa8d823..3603c330 100644 --- a/docs/source/tutorial/functions.rst +++ b/docs/source/tutorial/functions.rst @@ -160,6 +160,8 @@ Notice here that we bind two separate functions. What if we wanted to bind only This is useful for functions which can take multiple types and need to behave differently based on those types. You can set as many overloads as you want, and they can be of many different types. +As a side note, binding functions with default parameters does not magically bind multiple versions of the function to be called with the default parameters. You must instead use :doc:`sol::overload<../api/overload>`. + .. note:: Function object ``obj`` -- a struct with a ``return_type operator()( ... )`` member defined on them, like all C++ lambdas -- are not interpreted as functions when you use ``set`` for ``mytable.set( key, value )``. This only happens automagically with ``mytable[key] = obj``. To be explicit about wanting a struct to be interpreted as a function, use ``mytable.set_function( key, func_value );``. You can be explicit about wanting a function as well by using the :doc:`sol::as_function<../api/as_function>` call.