У меня есть N параметров разных типов (uint, int и float), и каждый параметр имеет свой допустимый диапазон значений (т.е. от 2,5 до 20,0). Учитывая также, что некоторые параметры являются производными от других параметров. Для этих параметров я использую разные функции (f1, f2, f3, ...).
Чтобы иметь возможность рассчитать допустимый диапазон значений (минимальных и максимальных) производных параметров, Я определил для каждого производного параметра две новые функции f_min и f_max. Внутри этих функций я вызываю f с правильной комбинацией значений минимального и максимального параметров, чтобы получить пределы моего производного параметра.
Давайте приведем простой пример:
Код: Выделить всё
f(a, b) = a / b
min = f(a_min, b_max)
max = f(a_max, b_min)
Сначала я сохраняю все минимальные и максимальные значения параметров в двух контейнерах. Затем я определяю функцию шаблона DerivLimit, которая получает в качестве аргументов шаблона указатель на функцию, которую нужно использовать для получения предела, и список индексов параметров, от которых он зависит. В качестве аргументов функция шаблона DerivLimit получает два списка минимальных и максимальных значений параметров.

Код: Выделить всё
template
static ParamData deriveLimitUtil(const ParamData minParams[], const ParamData maxParams[],
ParamValue (*function)(ParamValue...))
{
ParamValue result = function(ParamValue(minParams[Indexes])..., ParamValue(maxParams[Indexes])...);
return result.getData();
}
template
static ParamData deriveLimit(const ParamData minParams[], const ParamData maxParams[])
{
return deriveLimitUtil(minParams, maxParams, function);
}
Код: Выделить всё
deriveLimit(minParams, maxParams);
Код: Выделить всё
ParamValue DeriveTest::deriveMaxLimit2(ParamValue minValue2, ParamValue minValue3, ParamValue maxValue2, ParamValue maxValue3)
Когда я компилирую этот код, компилятор возвращает следующую ошибку:
Код: Выделить всё
error: mismatched argument pack lengths while expanding ‘(ParamValue)(maxParams[Indexes])’
In instantiation of ParamData deriveLimitUtil(const ParamData*, const ParamData*, ParamValue
(*)(ParamValue...)) [with short unsigned int ...Indexes = {1u, 2u}; ParamType = int; Args = {int, float, int, float}]’:
required from ParamData deriveLimit(const ParamData*, const ParamData*) [with FuncType = ParamValue (*)(ParamValue, ParamValue, ParamValue, ParamValue); FuncType function = DeriveTest::deriveMaxLimit2; short unsigned int ...Indexes = {1u, 2u}]’
Как я развернул только половину пакета параметров Args для paramvalue (minparams [indexes]) ... ?
Подробнее здесь: https://stackoverflow.com/questions/402 ... meter-pack
Мобильная версия