Ich stoße häufig auf ein Problem, das im folgenden minimalen hypothetischen Beispiel veranschaulicht wird.
Ich habe eine Bibliotheksfunktion wie diese:
/**
* Here, `shoes`, `isNew` and `color` will all be strings or string views
* given by clients.
*
* `p1`, `p2`, `p3` are variables to coreFun().
*/
int clientAPI (
auto && shoes, auto && isNew, auto && color,
int p1, int p2, int p3
)
{
int rst = 0; // result.
if (shoes == "snicker") {
if (isNew == "yes") {
if (color == "red") rst = coreFun (p1, p2, p3);
else if (color == "green") rst = coreFun (p1, p2, p3);
else rst = coreFun (p1, p2, p3);
}
else { // isNew == "no"
if (color == "red") rst = coreFun (p1, p2, p3);
else if (color == "green") rst = coreFun (p1, p2, p3);
else rst = coreFun (p1, p2, p3);
}
}
else if (shoes == "leather") {
if (isNew == "yes") {
if (color == "red") rst = coreFun (p1, p2, p3);
else if (color == "green") rst = coreFun (p1, p2, p3);
else rst = coreFun (p1, p2, p3);
}
else { // isNew == "no"
if (color == "red") rst = coreFun (p1, p2, p3);
else if (color == "green") rst = coreFun (p1, p2, p3);
else rst = coreFun (p1, p2, p3);
}
}
else { // shoes == "other"
if (isNew == "yes") {
if (color == "red") rst = coreFun (p1, p2, p3);
else if (color == "green") rst = coreFun (p1, p2, p3);
else rst = coreFun (p1, p2, p3);
}
else { // isNew == "no"
if (color == "red") rst = coreFun (p1, p2, p3);
else if (color == "green") rst = coreFun (p1, p2, p3);
else rst = coreFun (p1, p2, p3);
}
}
return rst;
}
Die Signatur von clientAPI() darf nicht geändert werden.
Meine Implementierung von clientAPI() funktioniert, ist es aber lächerlich lang. Zum Glück habe ich in diesem Beispiel nur 18 Kombinationen. Im wirklichen Leben bin ich auf bis zu 50 solcher Vorlagenparameter gestoßen. Schmerzen.
Ich beabsichtige, die Implementierung wie folgt zu vereinfachen:
int clientAPI (
auto && shoes, auto && isNew, auto && color,
int p1, int p2, int p3
)
{
using namespace std;
auto clientInputs = tuple(move(shoes), move(isNew), move(color));
constexpr auto mapping = tuple(
tuple(pair("sniker", 0), pair("leather", 1), pair("other", 2)),
tuple(pair("no", false), pair("yes", true)),
tuple(pair("red", 'r'), pair("green", 'g'), pair("blue", 'b'))
);
// ===========================================================================
// How to (i) achieve compile time deduction of the 18 instances
// using a some kind of constexpr loop over `clientInputs` and `mapping`,
// and then (ii) execute the correct instance of coreFun()
// corresponding to `clientInputs`?
//
// If the above is impossible, can we achieve the goal using
// std::function and some kind of compile time lookup table ?
// ===========================================================================
}
Meine Frage ist in den Kommentaren oben aufgeführt. Könnte es außerdem eine magische Funktion/Klasse geben, die coreFun, clientInputs und Mapping als Parameter verwenden und den Preis der Schuhe ermitteln kann?
Vielen Dank!!
Ich stoße häufig auf ein Problem, das im folgenden minimalen hypothetischen Beispiel veranschaulicht wird. Ich habe eine Bibliotheksfunktion wie diese: [code]/** * `shoes` can take values {0, 1, 2} * `isNew` can take values {false, true} * `color` can take values {'r', 'g', 'b'} */ template int coreFun (int p1, int p2, int p3) { return shoes + isNew + int(color) + p1 + p2 + p3; // shoes price. } [/code] Jetzt muss ich eine Funktion schreiben, die Clients verwenden können: [code]/** * Here, `shoes`, `isNew` and `color` will all be strings or string views * given by clients. * * `p1`, `p2`, `p3` are variables to coreFun(). */ int clientAPI ( auto && shoes, auto && isNew, auto && color, int p1, int p2, int p3 ) { int rst = 0; // result. if (shoes == "snicker") { if (isNew == "yes") { if (color == "red") rst = coreFun (p1, p2, p3); else if (color == "green") rst = coreFun (p1, p2, p3); else rst = coreFun (p1, p2, p3); } else { // isNew == "no" if (color == "red") rst = coreFun (p1, p2, p3); else if (color == "green") rst = coreFun (p1, p2, p3); else rst = coreFun (p1, p2, p3); } } else if (shoes == "leather") { if (isNew == "yes") { if (color == "red") rst = coreFun (p1, p2, p3); else if (color == "green") rst = coreFun (p1, p2, p3); else rst = coreFun (p1, p2, p3); } else { // isNew == "no" if (color == "red") rst = coreFun (p1, p2, p3); else if (color == "green") rst = coreFun (p1, p2, p3); else rst = coreFun (p1, p2, p3); } } else { // shoes == "other" if (isNew == "yes") { if (color == "red") rst = coreFun (p1, p2, p3); else if (color == "green") rst = coreFun (p1, p2, p3); else rst = coreFun (p1, p2, p3); } else { // isNew == "no" if (color == "red") rst = coreFun (p1, p2, p3); else if (color == "green") rst = coreFun (p1, p2, p3); else rst = coreFun (p1, p2, p3); } } return rst; } [/code] Die Signatur von clientAPI() darf nicht geändert werden. Meine Implementierung von clientAPI() funktioniert, ist es aber lächerlich lang. Zum Glück habe ich in diesem Beispiel nur 18 Kombinationen. Im wirklichen Leben bin ich auf bis zu 50 solcher Vorlagenparameter gestoßen. Schmerzen. Ich beabsichtige, die Implementierung wie folgt zu vereinfachen: [code]int clientAPI ( auto && shoes, auto && isNew, auto && color, int p1, int p2, int p3 ) { using namespace std; auto clientInputs = tuple(move(shoes), move(isNew), move(color)); constexpr auto mapping = tuple( tuple(pair("sniker", 0), pair("leather", 1), pair("other", 2)), tuple(pair("no", false), pair("yes", true)), tuple(pair("red", 'r'), pair("green", 'g'), pair("blue", 'b')) );
// =========================================================================== // How to (i) achieve compile time deduction of the 18 instances // using a some kind of constexpr loop over `clientInputs` and `mapping`, // and then (ii) execute the correct instance of coreFun() // corresponding to `clientInputs`? // // If the above is impossible, can we achieve the goal using // std::function and some kind of compile time lookup table ? // =========================================================================== } [/code] Meine Frage ist in den Kommentaren oben aufgeführt. Könnte es außerdem eine magische Funktion/Klasse geben, die coreFun, clientInputs und Mapping als Parameter verwenden und den Preis der Schuhe ermitteln kann? Vielen Dank!!
Ich stoße häufig auf ein Problem, das im folgenden minimalen hypothetischen Beispiel veranschaulicht wird.
Ich habe eine Bibliotheksfunktion wie diese:
/**
* `shoes` can take values {0, 1, 2}
*...
Ich habe eine React -Komponente, die eine Liste von Ladern mit einem Ratenlimit verwaltet. Lader können sich in einem von drei Staaten befinden: anhängig, aktiv oder abgeschlossen. Wenn ein Loader...
Ich habe eine React -Komponente, die eine Liste von Ladern mit einem Ratenlimit verwaltet. Lader können sich in einem von drei Staaten befinden: anhängig, aktiv oder abgeschlossen. Wenn ein Loader...
Ich verwende Windows 10 und habe Anaconda installiert, möchte aber unabhängig eine ausführbare Datei in einer neuen, sauberen Minimalumgebung mit Python 3.5 erstellen. Also habe ich einige Tests...