以功能方式组合谓词

问题描述

Boost Hana是否提供将谓词与逻辑运算符组合的方法

我指的是这样的东西

    TextField(
                    textInputAction: TextInputAction.go,onSubmitted: (newValue) {
                      print('TextFormField text = $newValue');
                      getPermitsApi(
                          status: _tabController.index + 1,search: searchController.text);
                    },Future<void> getPermitsApi({@required int status,String search}) async {
if (search == null) {
  search = '';
}
GetPermitsModel getPermitsModel = GetPermitsModel();
_selectedindex = widget.index;
if (_selectedindex == 2) {
  _selectedindex--;
}
http.Response response = await http.get(
    '*******/getPermits/$status/$_selectedindex/$search',headers: {
      "api_key": "******","Devicetoken":
          "*******"
    });
if (response.statusCode == 200) {
  var data = response.body;
  print('getPermits response $data');

  var dataMap = jsonDecode(data);
  if (jsonDecode(data)['result']['status'] == 0) {
    getPermitsModel = GetPermitsModel.fromJson(dataMap);
    print('tabWidgets = ${_tabsWidgets.length}');
    if (search != '') {
      setState(() {
        _tabsWidgets[status - 1] = tabContent(true,getPermitsModel);
      });
      // _tabsWidgets.insert(status - 1,tabContent(true,getPermitsModel));
      print(_tabsWidgets[status - 1]);
    } else {
      _tabsWidgets.add(tabContent(true,getPermitsModel));
    }
  } else if (jsonDecode(data)['result']['status'] == 1) {
    setState(() {
      _tabsWidgets.add(tabContent(false));
    });
  } else {
    _showAlert(alertMessage: getPermitsModel.result.additionalinformation);
  }
} }


  Widget tabContent(bool showContent,[GetPermitsModel getPermits]) {
return showContent
    ? ListView.builder(
        shrinkWrap: true,padding: const EdgeInsets.all(8),itemCount: getPermits.data.length,itemBuilder: (context,index) {
          return GestureDetector(
            onTap: () {
              Navigator.push(
                  context,MaterialPageRoute(
                      builder: (context) => PermitDetails(
                          permitId: getPermits.data[index].permitId,guId: getPermits.data[index].permitGuid)));
            },child: Container(
              decoration: Boxdecoration(
                  color: Colors.white,BoxShadow: [
                    new BoxShadow(
                      color: Color(0xFFC6C6C6),blurRadius: 4,),],borderRadius: BorderRadius.circular(8)),height: 200,child: Column(
                children: <Widget>[
                  Container(
                    child: Text(
                      getPermits.data[index].permitId,style: TextStyle(
                          color: darkGreen,fontWeight: FontWeight.bold,fontSize: 30),margin: EdgeInsets.only(top: 10,bottom: 15),Row(
                    textDirection: TextDirection.rtl,children: <Widget>[
                      Container(
                        margin: EdgeInsets.only(right: 8,left: 40),child: Text(
                          'المقاول ',style: TextStyle(color: darkGrey,fontSize: 20),Text(
                        getPermits.data[index].contractor,style: TextStyle(color: lightGrey,fontSize: 15),)
                    ],SizedBox(
                    height: 10,child: Text(
                          'الموقع ',Text(
                        getPermits.data[index].address,child: Text(
                          'الحالة ',Text(
                        getPermits.data[index].permitStatus,)
                ],);
        })
    : Center(child: Text('لا يوجد تصاريح')); }

可以这样使用:

constexpr auto both = [](auto&& f,auto&& g){
    return [&f,&g](auto&& x){ return f(x) && g(x); };
};

在Hana,我希望还有一种类似于hana::on的infix方式使用它的方式,例如int main() { std::vector<int> v{1,2,3,4,5,6,7,8,9,10}; auto less_than_7 = hana::reverse_partial(std::less_equal<int>{},7); auto more_than_3 = hana::reverse_partial(std::greater_equal<int>{},3); auto r = ranges::views::remove_if(v,both(less_than_7,more_than_3)); } (尽管both(less_than_7,more_than_3) === less_than_7 ^both^ more_than_3会更好,但是我刚刚发现它是and的同义词。

或者它是否提供一种提升标准运算符&&来对函数函子进行运算的方法

解决方法

您可以像这样使用demux

auto both = hana::demux(std::logical_and<bool>{});
// Or for any number of predicates
auto all = hana::demux([](auto const&... x) noexcept(noexcept((static_cast<bool>(x),...))) { return (true && ... && static_cast<bool>(x)); });
ranges::views::remove_if(v,both(less_than_7,more_than_3));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...