C++ Развернуть только часть пакета параметровC++

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

Сообщение Anonymous »

Предисловие
У меня есть 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);
}
Например, чтобы получить верхний предел параметра 2, я вызываю DeriverLimit следующим образом:

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

deriveLimit(minParams, maxParams);
Где DerivateMaxLimit2 объявлен следующим образом:

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

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
Ответить

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

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

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

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

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