条件の順列を 1 つのオブジェクトに抽象化できるように、binding_condition というテンプレート クラスを作成しました。現在、ラムダとチェックが必要な変数を渡すことで機能しますが、参照している変数をキャプチャする必要があるため、ラムダは誤解を招く可能性があります。
例えば:
bool someVal = true;
int h = 10;
double p = 99.8;
char c = 'C';
binding_condition<bool> bc(
[] (bool b)
{ return b; },
someVal);
binding_condition<bool, int> bc2(
[] (bool b, int i)
{ return b && (i > 9); },
someVal, h);
binding_condition<bool, int, double> bc3(
[] (bool b, int i, double d)
{ return b && (i > 9) && (d < 100); },
someVal, h, p);
binding_condition<bool, int, double, char> bc4(
[] (bool b, int i, double d, char c)
{ return b && (i > 9) && (d < 100) && c == 'C'; },
someVal, h, p, c);
これにより、複雑な条件を 1 つの名前に抽象化できます。
if (ThisComplexCondition) ...
else if (ThisOtherComplexCondition ...
...
ただし、式テンプレートまたはその他の方法を使用して、次のような構文を許可する方法があるかどうか疑問に思っています。
binding_condition<bool, int, double> ComplexCondition = myClass.isTrue() && someThing.id < 100 && someDouble > 30.2;
上記の表現は特に独創的ではありませんが、次の表現を考えてみてください。
// analyzing chords in music to roman numeral notation, detect modulations, etc
// isChordRelatedToKey (the chord can be made from the current key
// isNeopolitan (the chord is a bii6 of the current key
// is major
// letter() is II/ii (ie C# major in C major is not a neapolitan, but Db major is)
// isSecondaryDominant
// chord is major
// chord is dominant of next chord (requires a new temporary key of next chord
// isSecondaryDiminished
// chord is diminished, and is the viio of the next chord
// all other forms of secondary, which means a ii/V in C major is A minor, which is also the vi of the key, and the iii/IV is also A minor
// nested secondary chords ie I - V - V/V - vii/V/V (C major, G major, D major, C# diminished)
// isModulation
// the current string of chords is not related to the current Key anymore
ある種のステートマシンを実装し、これらの制限をオブジェクトにパッケージ化し、次のように単純にチェックしたいと考えています。
if (isModulation) ...
if (isSecondary) ... // recursive
if (isChordNoRelation) ... // some chord that makes no sense from previous string
しかし、赤ちゃんは一度に歩みます。今のところ、その式で参照されている変数/関数を使用して、式を割り当てて保存できるかどうかを知りたいだけです。
これは可能ですか?