    // User-defined infix operator framework

    template <typename LeftOperand, typename Operation>
    struct LeftHelper
    {
        const LeftOperand& leftOperand;
        const Operation& operation;
        LeftHelper(const LeftOperand& leftOperand, const Operation& operation)
            : leftOperand(leftOperand), operation(operation) {}
    };
    
    template <typename LeftOperand, typename Operation >
    auto operator < (const LeftOperand& leftOperand, Operation& operation)
    {
        return LeftHelper<LeftOperand, Operation>(leftOperand, operation);
    }
    
    template <typename LeftOperand, typename Operation, typename RightOperand>
    auto operator > (LeftHelper<LeftOperand, Operation> leftHelper, const RightOperand& rightOperand)
    {
        return leftHelper.operation(leftHelper.leftOperand, rightOperand);
    }

    // Defining a new operator

    #include <cmath>
    static auto pwr = [](const auto& operand1, const auto& operand2) { return std::pow(operand1, operand2); };

    // using it
    #include <iostream>
    int main() 
    {
       std::cout << (2 <pwr> 16) << std::endl;
       return 0;
    }
