gpt4 book ai didi

c++ - 模板类的多个可变参数包

转载 作者:可可西里 更新时间:2023-11-01 18:18:24 27 4
gpt4 key购买 nike

我正在使用可变参数包进行基于策略的类设计。

template <APITypes APIType, class... Policies>
class IShader : public Policies... {

};

策略在调用时定义,如果未指定则使用默认值。当我需要添加另一个可变参数包时,问题就来了:

template <AttributeType... Attributes, APITypes APIType, class... Policies>
class IShader : public Policies... {

};

这会导致错误“模板参数包必须是最后一个模板参数”。我计划使用属性包来更改至少一个策略的行为。但是我不知道如何在一个模板类中获取两个可变参数包。

最佳答案

我认为最简单的答案是为您的参数包创建模板类型包装器。例如:

template <AttributeType... T>
struct Attributes {};

template <typename... T>
struct Policies {};

然后你可以声明你的 IShader 类型:

template <typename... T>
class IShader;

将您的实现创建为特化。请注意,在特化中,您可以有多个参数包参数。

template <AttributeType... AttributeList, ApiTypes APIType, typename... PolicyList>
class IShader<Attributes<AttributeList...>, ApiType, Policies<PolicyList...>>
: public PolicyList...
{
...
};

然后您甚至可以允许用户以不同的顺序指定参数(如果通过继承以这种方式进行,请确保转发构造函数):

template <AttributeType... AttributeList, ApiTypes APIType, typename... PolicyList>
struct IShader<ApiType, Policies<PolicyList...>, Attributes<AttributeList...>
: public IShader<Attributes<AttributeList...>, ApiType, Policies<PolicyList...>>
{
using IShader<Attributes<AttributeList...>, ApiType, Policies<PolicyList...>>::IShader;
};

如果您真的很花哨,您甚至可以使用元编程技巧来允许参数以任何顺序排列,而无需枚举所有顺序。这留给读者作为练习。 :)

关于c++ - 模板类的多个可变参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37200391/

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