C ++一元函数用于逻辑真

时间:2013-12-24 17:27:17

标签: c++ stl boolean predicate unary-operator

我正在尝试在bool的向量上使用any_of函数。 any_of函数需要一个返回bool的一元谓词函数。但是,当输入到函数中的值已经是我想要的bool时,我无法弄清楚要使用什么。我猜一些函数名称如“logical_true”或“istrue”或“if”但这些似乎都不起作用。我在下面粘贴了一些代码来展示我想要做的事情。提前感谢任何想法。 --Chris

// Example use of any_of function.

#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char *argv[]) {
    vector<bool>testVec(2);

    testVec[0] = true;
    testVec[1] = false;

    bool anyValid;

    anyValid = std::find(testVec.begin(), testVec.end(), true) != testVec.end(); // Without C++0x
    // anyValid = !std::all_of(testVec.begin(), testVec.end(), std::logical_not<bool>()); // Workaround uses logical_not
    // anyValid = std::any_of(testVec.begin(), testVec.end(), std::logical_true<bool>()); // No such thing as logical_true

    cout << "anyValid = " << anyValid <<endl;

    return 0;
}

4 个答案:

答案 0 :(得分:4)

你可以使用lambda(从C ++ 11开始):

bool anyValid = std::any_of(
    testVec.begin(), 
    testVec.end(), 
    [](bool x) { return x; }
);

here是一个现实的例子。

当然,您也可以使用仿函数:

struct logical_true {
    bool operator()(bool x) { return x; }
};

// ...

bool anyValid = std::any_of(testVec.begin(), testVec.end(), logical_true());

here是该版本的实例。

答案 1 :(得分:2)

看起来你想要一个像身份函数(一个返回它传递的值的函数)的东西。这个问题似乎表明std::中没有这样的事情:

Default function that just returns the passed value?

在这种情况下,最简单的事情可能就是写

bool id_bool(bool b) { return b; }

只是使用它。

答案 2 :(得分:0)

从C ++ 20开始,我们得到std::identity,这可能会有所帮助。

答案 3 :(得分:-1)

我最终在这里寻找一个C ++标准库符号来做到这一点:

template<typename T>
struct true_ {
    bool operator()(const T&) const { return true; }
};

我认为这是操作人员想要的,并且可以使用,例如,如下所示:

std::any_of(c.begin(), c.end(), std::true_);

我在标准库中找不到类似的东西,但是上面的结构有效并且很简单。

虽然上面的any_of表达式孤立地没有意义(除非true为空,否则它总是返回c,但true_的有效用例如下:期望谓词的模板类的默认模板参数。