30

我想要一个评估 2 个bool变量的函数(如真值表)。

例如:

自从

T | F : T

然后

myfunc('t', 'f', ||);  /*defined as: bool myfunc(char lv, char rv, ????)*/

应该return true;

如何传递第三个参数?

(我知道可以将它作为 char* 传递,但是我将不得不有另一个表来比较运算符字符串,然后执行我想避免的操作)

是否可以将^(XOR) 或||(OR) 或&&(AND) 等运算符传递给函数/方法?

4

5 回答 5

29

宣布:

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

或者,如果您需要单独链接它:

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

然后你可以调用:

myfunc('t', 'f', std::logical_or<bool>());
于 2010-12-25T15:12:57.667 回答
5

@ybungalobill 发布了一个 C++ 正确答案,你应该坚持下去。如果要传递运算符,函数将不起作用,但宏会起作用:

#define MYFUNC(lv, rv, op) ....

// Call it like this
MYFUNC('t', 'f', ||);

小心,宏是邪恶的

于 2010-12-25T15:18:25.000 回答
2

您可以做的是定义返回特定类型的代理运算符。

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);

如果绝望的话,你可以使用模板来传递复杂的逻辑表达式。

此外,XOR 运算符是按位的,而不是逻辑的 - 尽管实际上没有什么区别。

然而,在 C++0x 中存在 lambda 是有原因的,因为这种东西在 C++03 中很糟糕。

于 2010-12-25T15:20:54.697 回答
1

在现代 C++ 中,可以使用 lambda 传递任何运算符。
更新 1:提议的解决方案引入了 @HolyBlackCat 建议的小改进

#include <iostream>

template<class T, class F> void reveal_or(T a, T b, F f)
{
    // using as function(a, b) instead of expression a || b is the same thing
    if ( f(a, b) ) 
        std::cout << a << " is || " << b << std::endl;
    else
        std::cout << a << " is not || " << b << std::endl;

}

template<class T> void reveal_or(T a, T b)
{
    // reuse the already defined ||
    reveal_or(a, b, [](T t1, T t2) {return t1 || t2; });
}

如果 || 不用担心如何传递参数 运算符已定义

int main ()
{
    reveal_or('1', 'a');
    return 0;
}

作为参数显式传递。我们可以传递任何东西,包括任何异国情调的废话

int main ()
{
    //same as above:
    reveal_or('1', 'a', [](char t1, char t2) { return t1 || t2; });
    //opposite of above
    reveal_or('1', 'a', [](char t1, char t2) { return !( t1 || t2; ) });

    return 0;
}
于 2021-05-28T11:42:56.563 回答
-2

很难实现。在 C++ 中,函数参数需要一个内存地址才能找到它的对象,但运算符是在编译时决定的。运算符不会是对象。因此,您可以考虑使用 MACRO 来完成您的任务。

于 2010-12-25T15:18:58.983 回答