BOOST_HOF_RETURNS

Description

The BOOST_HOF_RETURNS macro defines the function as the expression equivalence. It does this by deducing noexcept and the return type by using a trailing decltype. Instead of repeating the expression for the return type, noexcept clause and the function body, this macro will reduce the code duplication from that.

Note: The expression used to deduce the return the type will also constrain the template function and deduce noexcept as well, which is different behaviour than using C++14’s return type deduction.

Synopsis

#define BOOST_HOF_RETURNS(...) 

Example

#include <boost/hof.hpp>
#include <cassert>

template<class T, class U>
auto sum(T x, U y) BOOST_HOF_RETURNS(x+y);

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

Incomplete this

Description

On some non-conformant compilers, such as gcc, the this variable cannot be used inside the BOOST_HOF_RETURNS macro because it is considered an incomplete type. So the following macros are provided to help workaround the issue.

Synopsis

// Declares the type of the `this` variable
#define BOOST_HOF_RETURNS_CLASS(...) 
// Used to refer to the `this` variable in the BOOST_HOF_RETURNS macro
#define BOOST_HOF_THIS
// Used to refer to the const `this` variable in the BOOST_HOF_RETURNS macro
#define BOOST_HOF_CONST_THIS

Example

#include <boost/hof.hpp>
#include <cassert>

struct add_1
{
    int a;
    add_1() : a(1) {}
    
    BOOST_HOF_RETURNS_CLASS(add_1);
    
    template<class T>
    auto operator()(T x) const 
    BOOST_HOF_RETURNS(x+BOOST_HOF_CONST_THIS->a);
};

int main() {
    assert(3 == add_1()(2));
}

Mangling overloads

Description

On older compilers some operations done in the expressions cannot be properly mangled. These macros help provide workarounds for these operations on older compilers.

Synopsis

// Explicitly defines the type for name mangling
#define BOOST_HOF_MANGLE_CAST(...) 
// C cast for name mangling
#define BOOST_HOF_RETURNS_C_CAST(...) 
// Reinterpret cast for name mangling
#define BOOST_HOF_RETURNS_REINTERPRET_CAST(...) 
// Static cast for name mangling
#define BOOST_HOF_RETURNS_STATIC_CAST(...) 
// Construction for name mangling
#define BOOST_HOF_RETURNS_CONSTRUCT(...)