Минимальный подход, чтобы вывести множество параметров шаблонов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.
}
< /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 и отображение в качестве параметров и создавать цену обуви?
Большое спасибо !!


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

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

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

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

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

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