inplace_function
etl::inplace_function
20.45.0
A small, in-place function wrapper that stores callable objects inside a fixed-size buffer (no dynamic allocation). It supports free functions, member functions, functors, and lambdas, with both runtime and compile-time bindings.
____________________________________________________________________________________________________
TReturn(TArgs...)
Function signature.
Object_Size
Size of the internal storage buffer. Defaults to ETL_DEFAULT_INPLACE_FUNCTION_SIZE.
Object_Alignment
Alignment of the internal storage buffer. Defaults to ETL_DEFAULT_INPLACE_FUNCTION_ALIGNMENT.
____________________________________________________________________________________________________
etl::inplace_function_exception
Base exception.
etl::inplace_function_uninitialized
Thrown (via ETL_ASSERT) when invoked without a target.
____________________________________________________________________________________________________
function_type
return_type
argument_types
____________________________________________________________________________________________________
Default constructor.
Copy/move constructors.
Construction from a free function pointer.
Construction from an object + member function pointer (const or non-const).
Construction from a lambda/functor (const or non-const).
____________________________________________________________________________________________________
Copy/move assignment.
Assignment from nullptr clears the target.
Assignment from function pointer.
Assignment from lambda/functor.
____________________________________________________________________________________________________
operator()
Invokes the bound callable and asserts if uninitialised.
call_if(...)
For void return bool indicating whether it executed.
For non-void returns etl::optional<TReturn>.
call_or(...)
Invokes the target or a fallback callable.
____________________________________________________________________________________________________
bool is_valid() const
Returns true if there is a valid callable.
explicit operator bool() const
Returns the result of is_valid()
____________________________________________________________________________________________________
void clear()
Clears any stored callable
void swap(inplace_function& other)
Swaps with another inplace_function.
____________________________________________________________________________________________________
static constexpr size_t size()
Returns the size of the internal storage.
static constexpr size_t alignment()
Returns the alignment of the internal storage.
____________________________________________________________________________________________________
Free function
set<&Function>()
create<&Function>()
Member function + instance (external linkage)
set<T, &TMethod, Instance>()
create<T, &TMethod, Instance>()
Callable object + instance (operator())
set<T, Instance>()
create<T, Instance>()
____________________________________________________________________________________________________
etl::inplace_function_for<TSignature, TStorage>
etl::inplace_function_for_any<TSignature, T0, ...>
____________________________________________________________________________________________________
make_inplace_function(function_ptr)
make_inplace_function(obj, &Type::Method)
make_inplace_function(lambda_or_functor)
make_inplace_function<TSignature>(function_like)
C++17-only overloads also exist for compile-time binding.
____________________________________________________________________________________________________
#include "etl/inplace_function.h"
int add(int a, int b) { return a + b; }
struct Accumulator
{
int base = 0;
int add_to(int v) { return base + v; }
};
void example()
{
etl::inplace_function<int(int, int)> f(add);
int sum = f(1, 2);
Accumulator acc{ 10 };
etl::inplace_function<int(int)> g(&Accumulator::add_to, acc);
int result = g(5);
}
____________________________________________________________________________________________________
If the callable object is larger than Object_Size or requires stricter alignment than Object_Alignment, compilation fails with a static_assert.
operator() asserts when called without a target; use call_if or call_or to avoid this.
Prefer inplace_function_for, inplace_function_for_any or make_inplace_function to deduce storage sizes safely.