The FIT_STATIC_FUNCTION macro allows initializing a function object from a constexpr expression. It uses the best practices as outlined in N4381. This includes using const to avoid global state, compile-time initialization of the function object to avoid the static initialization order fiasco, and an external address of the function object that is the same across translation units to avoid possible One-Definition-Rule(ODR) violations.

In C++17, this achieved using the inline keyword. However, on older compilers it is initialized using a reference to a static member variable. The static member variable is default constructed, as such the user variable is always default constructed regardless of the expression.

By default, all functions defined with FIT_STATIC_FUNCTION use the reveal adaptor to improve error messages.


#include <fit.hpp>
#include <cassert>

struct sum_f
    template<class T, class U>
    T operator()(T x, U y) const
        return x+y;

FIT_STATIC_FUNCTION(sum) = sum_f();
FIT_STATIC_FUNCTION(partial_sum) = fit::partial(sum_f());

int main() {
    assert(sum(1, 2) == partial_sum(1)(2));