/**
* 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;
}
Подпись clientAPI() не должна меняться.
Моя реализация clientAPI() работает, но смехотворно долго. К счастью, в этом примере у меня всего 18 комбинаций. В реальной жизни я встречал целых 50 таких параметров шаблона. Боль.
Я намерен упростить реализацию следующим образом:
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 ?
// ===========================================================================
}
Мой вопрос указан в комментариях выше. Более того, может ли существовать какая-то волшебная функция/класс, которая может принимать coreFun, clientInputs и сопоставление в качестве параметров и определять цену обуви?
Большое спасибо!!
Я часто сталкиваюсь с проблемой, проиллюстрированной в следующем минимальном гипотетическом примере. У меня есть такая библиотечная функция: [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] Теперь мне нужно написать функцию, которую смогут использовать клиенты: [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] Подпись clientAPI() не должна меняться. Моя реализация clientAPI() работает, но смехотворно долго. К счастью, в этом примере у меня всего 18 комбинаций. В реальной жизни я встречал целых 50 таких параметров шаблона. Боль. Я намерен упростить реализацию следующим образом: [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] Мой вопрос указан в комментариях выше. Более того, может ли существовать какая-то волшебная функция/класс, которая может принимать coreFun, clientInputs и сопоставление в качестве параметров и определять цену обуви? Большое спасибо!!