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));
}
sind einige Spielzeuge
Dann:..
if (either(between(90,97), is_gt(122))(ncode[i]+key[ikey])) {
Dies kann ein bisschen mehr glatt gemacht werden, wenn wir ein Prädikat zu sein ein Funktionsobjekt Rückkehr bool
definieren, die &&
und ||
und ~
ove unterstützt rloading, und haben unsere oben Spielzeug Prädikate zurückkehren, erhalten wir:
if ((between(90,97) || is_gt(122))(ncode[i]+key[ikey])) {
immer der either
Präfix Lärm los.
Für mehr Effizienz in Nicht-Fällen erfassen Sie die Grenzen durch Verschieben.
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);
}
Mit jedem der oben toy
Funktionen return predicate(lambda);
statt Lambda zurück.
Dieser Code ist einfacher und shorree am Ort der Verwendung, sollte Null Laufzeit Overhead haben, ist aber eine andere Art der Codierung als herkömmliche C++.
Lesbar für wen? Du? Mich? Der Papst? Eine Zeile, zwei Zeilen, drei Zeilen, gelangweilt? Sie mögen 80 Spalten, ich mag 100 Spalten. Sie mögen wirklich kurze Namen Ich mag beschreibende Namen. Sie bevorzugen Quiche und ich nehme, was auch immer im Automaten ist. –
Schreiben Sie immer Code, als ob der Betreuer ein Psychopath ist, der weiß, wo Sie leben :-P –