template<class Lower>
auto is_gt(Lower&&l){
return [=](auto&&x){ return l<x; };
}
template<class Higher>
auto is_lt(Higher&&l){
return [=](auto&&x){ return x<l; };
}
template<class L, class R>
auto also(L&& l, R&& r){
return [=](auto&&x){return l(x)&&r(x); };
}
template<class L, class R>
auto either(L&& l, R&& r){
return [=](auto&&x){return l(x)||r(x); };
}
template<class Lower, class Upper>
auto between(Lower&& l, Upper&& u){
return also(is_gt(l), is_lt(u));
}
некоторые игрушки
. Тогда:.
if (either(between(90,97), is_gt(122))(ncode[i]+key[ikey])) {
Это может быть немного более гладким Если мы определим предикат является функцией объекта возвращения bool
, который поддерживает &&
и ||
и ~
Ove rloading, и есть наши выше игрушки возвращают предикаты, мы получим:
if ((between(90,97) || is_gt(122))(ncode[i]+key[ikey])) {
избавившись от either
приставки шума.
Для большей эффективности в случаях, не связанных с int
, снимать границы путем перемещения.
template<class F>
struct predicate_t:F{
predicate_t(F const& f):F(f){}
template<class F2>
friend auto operator&&(predicate const& f1,predicate<F2> const& f2){
auto r=[=](auto&&...args){
return f1(args...)&&f2(args...);
};
return predicate_t<decltype(r)>(r);
}
template<class F2>
friend auto operator||(predicate const& f1,predicate<F2> const& f2){
auto r=[=](auto&&...args){
return f1(args...)||f2(args...);
};
return predicate_t<decltype(r)>(r);
}
template<class F2>
friend auto operator!(predicate const& f1){
auto r=[=](auto&&...args){
return !f1(args...);
};
return predicate_t<decltype(r)>(r);
}
};
template<class F>
predicate_t<std::decay_t<F>>
predicate(F&&f){
return std::forward<F>(f);
}
С каждым из перечисленных выше функций, возвращающих toy
return predicate(lambda);
вместо лямбда.
Этот код более простой и shorree в точке использования, должен иметь нулевое рабочее время, но это другой стиль кодирования, чем обычный C++.
Считываемый для кого? Вы? Меня? Папа? Одна строка, две строки, три строки, скучно? Вам нравится 80 столбцов, мне нравится 100 столбцов. Вам нравятся действительно короткие имена, мне нравятся описательные имена. Вы предпочитаете quiche, и я возьму все, что в торговом автомате. –
Всегда пишите код, как если бы сопровождающий был психопатом, который знает, где вы живете :-P –