Minimaler Ansatz zur Ableitung vieler VorlagenparameterC++

Programme in C++. Entwicklerforum
Guest
 Minimaler Ansatz zur Ableitung vieler Vorlagenparameter

Post by Guest »

Ich stoße häufig auf ein Problem, das im folgenden minimalen hypothetischen Beispiel veranschaulicht wird.
Ich habe eine Bibliotheksfunktion wie diese:

Code: Select all

/**
* `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.
}
Jetzt muss ich eine Funktion schreiben, die Clients verwenden können:

Code: Select all

/**
* 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:

Code: Select all

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!!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post