问题描述
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));