Минимальный подход к выводу большого количества параметров шаблонаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Минимальный подход к выводу большого количества параметров шаблона

Сообщение Anonymous »

Я часто сталкиваюсь с проблемой, проиллюстрированной в следующем минимальном гипотетическом примере.
У меня есть такая библиотечная функция:

Код: Выделить всё

/**
* `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.
}
Теперь мне нужно написать функцию, которую смогут использовать клиенты:

Код: Выделить всё

/**
* 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 и сопоставление в качестве параметров и определять цену обуви?
Большое спасибо!!


Подробнее здесь: https://stackoverflow.com/questions/793 ... parameters
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»