gpt4 book ai didi

C++只展开部分参数包

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:10 28 4
gpt4 key购买 nike

前言

假设我有 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)

如何解决

首先,我将所有最小和最大参数值存储到两个容器中。然后我定义一个 deriveLimit模板函数作为模板参数获取指向函数的指针,用于导出限制和它所依赖的参数索引列表。作为函数参数 deriveLimit模板函数获取最小和最大参数值的两个列表。

Container for the minimum and maximum parameter values

template <ParamIndex ...Indexes, typename ParamType, typename ...Args>
static ParamData deriveLimitUtil(const ParamData minParams[], const ParamData maxParams[],
ParamValue<ParamType> (*function)(ParamValue<Args>...))
{
ParamValue<ParamType> result = function(ParamValue<Args>(minParams[Indexes])..., ParamValue<Args>(maxParams[Indexes])...);
return result.getData();
}

template <typename FuncType, FuncType function, ParamIndex ...Indexes>
static ParamData deriveLimit(const ParamData minParams[], const ParamData maxParams[])
{
return deriveLimitUtil<Indexes...>(minParams, maxParams, function);
}

例如,为了导出参数 2 的上限,我调用 deriveLimit如下:

deriveLimit<typeof(&DeriveTest::deriveMaxLimit2), &DeriveTest::deriveMaxLimit2, ParamIndex::PARAM_2_INT, ParamIndex::PARAM_3_FLOAT_1>(minParams, maxParams);

deriveMaxLimit2 声明如下:

ParamValue<int32_t> DeriveTest::deriveMaxLimit2(ParamValue<int32_t> minValue2, ParamValue<float> minValue3, ParamValue<int32_t> maxValue2, ParamValue<float> maxValue3)

问题

当我编译这段代码时,编译器返回以下错误:

error: mismatched argument pack lengths while expanding ‘(ParamValue<Args>)(maxParams[Indexes])’
In instantiation of ParamData deriveLimitUtil(const ParamData*, const ParamData*, ParamValue<ParamType> (*)(ParamValue<Args>...)) [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<int> (*)(ParamValue<int>, ParamValue<float>, ParamValue<int>, ParamValue<float>); FuncType function = DeriveTest::deriveMaxLimit2; short unsigned int ...Indexes = {1u, 2u}]’

问题

如何为 ParamValue<Args>(minParams[Indexes])... 只扩展参数包 Args 的一半? ?

最佳答案

How to I expand only half of the parameter pack Args for ParamValue<Args>(minParams[Indexes])... ?

#include <tuple>
#include <utility>
#include <cstddef>

template <ParamIndex ...Indexes, typename ParamType, typename ...Args, std::size_t ...Is>
static ParamData deriveLimitUtil(const ParamData minParams[], const ParamData maxParams[],
ParamValue<ParamType> (*function)(ParamValue<Args>...),
std::index_sequence<Is...>)
{
using Tuple = std::tuple<Args...>;
ParamValue<ParamType> result = function(ParamValue<std::tuple_element_t<Is, Tuple>>(minParams[Indexes])...
, ParamValue<std::tuple_element_t<Is, Tuple>>(maxParams[Indexes])...);
return result.getData();
}

template <typename FuncType, FuncType function, ParamIndex ...Indexes>
static ParamData deriveLimit(const ParamData minParams[], const ParamData maxParams[])
{
return deriveLimitUtil<Indexes...>(minParams, maxParams, function, std::make_index_sequence<sizeof...(Indexes)>{});
}

关于C++只展开部分参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40259794/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com