Passing operator as a parameter

后端 未结 4 1548
我在风中等你
我在风中等你 2021-02-05 03:25

I want to have a function that evaluates 2 bool vars (like a truth table)

for example:

since

T | F : T

then

myfunc(\'t\', \'f         


        
相关标签:
4条回答
  • 2021-02-05 03:30

    It's hard to be realized. In C++, function parameter need an memroy address to find its object, but operator is decided in compile time. Operator won't be a object. So you can think about MACRO to finish your task.

    0 讨论(0)
  • 2021-02-05 03:33

    Declare:

    template<class Func> bool myfunc(char lv, char rv, Func func);
    

    Or if you need to link it separately:

    bool myfunc(char lv, char rv, std::function<bool(bool,bool)> func);
    

    Then you can call:

    myfunc('t', 'f', std::logical_or<bool>());
    
    0 讨论(0)
  • 2021-02-05 03:33

    @ybungalobill posted a C++ correct answer and you should stick to it. If you want to pass the operators, functions will not work, but macros would do the work:

    #define MYFUNC(lv, rv, op) ....
    
    // Call it like this
    MYFUNC('t', 'f', ||);
    

    Be careful, macros are evil.

    0 讨论(0)
  • 2021-02-05 03:48

    What you can do is define proxy operators that return specific types.

    namespace detail {
        class or {
            bool operator()(bool a, bool b) {
                return a || b;
            }
        };
        class and {
            bool operator()(bool a, bool b) {
                return a && b;
            }
        };
        // etc
        class X {
            or operator||(X x) const { return or(); }
            and operator&&(X x) const { return and(); }
        };
    };
    const detail::X boolean;
    template<typename T> bool myfunc(bool a, bool b, T t) {
         return t(a, b);
    }
    // and/or
    bool myfunc(bool a, bool b, std::function<bool (bool, bool)> func) {
        return func(a, b);
    }
    // example
    bool result = myfunc(a, b, boolean || boolean);
    

    You can if desperate chain this effect using templates to pass complex logical expressions.

    Also, the XOR operator is bitwise, not logical- although the difference is realistically nothing.

    However, there's a reason that lambdas exist in C++0x and it's because this kind of thing flat out sucks in C++03.

    0 讨论(0)
提交回复
热议问题