Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java谓词的C/C++等价物_Java_C++_C_Predicate_Predicates - Fatal编程技术网

Java谓词的C/C++等价物

Java谓词的C/C++等价物,java,c++,c,predicate,predicates,Java,C++,C,Predicate,Predicates,Java中是否有C/C++等价的谓词类结构/类 具体来说,我有一个非常简单的Java代码,如下所示 import java.util.function.Predicate; public class JavaPredicates { public static void main(String[] args) { Predicate<String> i = (s)-> s.equals("ABCD"); Predicate<Str

Java中是否有C/C++等价的谓词类结构/类

具体来说,我有一个非常简单的Java代码,如下所示

import java.util.function.Predicate;
public class JavaPredicates {
    public static void main(String[] args) {
        Predicate<String> i  = (s)-> s.equals("ABCD");
        Predicate<String> j  = (s)-> s.equals("EFGH");
        Predicate<String> k  = (s)-> s.equals("IJKL");
        Predicate<String> l  = (s)-> s.equals("MNOP");
        Predicate<String> m  = (s)-> s.equals("QRST");
        Predicate<String> n  = (s)-> s.equals("UVWYZ");

        System.out.println(i.or(j).or(k).or(l).or(m).or(n).test("ABCD"));
    }
}

<>我想在C或C++中实现相同的程序。是否有默认方法或外部库来执行此操作?

C++的lambda与您正在使用的java构造非常相似:

auto i = [](string const & s){return s == "ABCD";}
它没有内置的链接,但其概念是类似的-一个内联定义的函数。您可以使用C++逻辑构造将lambdas组合到您想要的任何构造中——甚至使用lambda来完成。p>
auto final_check = [i,j,k,l,m,n](string const & s){return i(s) || j(s) || k(s).....};
简化的语法是自动lambdaName=[]->{body}

[]是lambda捕获的Java最终变量或有效的最终变量列表,您可以在此处声明它们,而不是将它们标记为最终变量 是lambda的参数列表 ret-returned type-如果lambda足够简单,编译器可以推断返回的类型,则该选项是可选的 {body}-不言而喻 全面解释

就你而言:

auto i = [/* no capture */]
          (const std::string& s) // params
          // no ret type spec: simple enough, the compiler will deduce it
          { return s=="ABCD"; }
;
// calling it is just as simple as
std::string str="xyz";
// no more i.test(str), you just call it as a function
bool res0 = i(str); // will be false


const char* charStr="mnp";
bool res1 = i(charStr); // the compiler knows the charStr can be converted
                        // to std::string and will generate the code
                        // for this conversion.

谓词C++具有可与LAMBDAS结合使用的函数对象模板:

auto i = [](auto const& v){ return v == "ABCD"; };
auto j = [](auto const& v){ return v == "EFGH"; };
auto k = bind(equal_to<>{}, "IJKL", placeholders::_1);
auto l = bind(equal_to<>{}, "MNOP", placeholders::_1);
现场: ,

或者,由于C++17,您可以使用:

auto const any_of = [](char const* str, auto&&... vs) {
    return (... || vs(str));
};

any_of("ABCD", i, j, k, l)
std::function呢?
auto const any_of = [](char const* str, auto&&... vs) {
    return (... || vs(str));
};

any_of("ABCD", i, j, k, l)