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