如何在 C++ 中将 Anythings 的模板作为模板参数传递?
How to pass template of Anythings as template parameter in C++?
要在模板中添加任何类型,只需编写 template <typename ...> struct S {};
.
要在模板中有任何值(例如 int
值),可以写 template <auto ...> struct S {};
.
要在模板中包含任何类型的模板,请编写 template <template <typename ...> class Tmpl> struct S {};
。
但是模板中怎么会有Anythings的模板呢? Anythings 意味着 1) 类型或 2) 值或 3) Anythings 的其他模板? IE。在模板中混合所有可能的东西。
即如何写template <template <Anything ...> class Tmpl> struct S {};
types/values/templates 可以在 Tmpl
参数列表中以任意顺序混合。
具有这种接受任何类型模板的结构 S
的一个用例是实现模板特征,即 S
可以以某种方式告诉 1) Tmpl 有多少参数。 2)对于每个参数(通过索引),它可以判断它是类型还是值还是另一个模板。
S
的另一个用例是需要它来实现丰富的编译时信息。 IE。如果我能说出有关传入模板的所有信息,它有多少参数以及它有什么参数,那么我就可以递归地组合复合类型 ID 或类型名称,从而进行编译时类型反射。
我还想知道如何在一个模板中以任意顺序至少混合类型和值? IE。怎么有template <TypeOrValue ... Args> struct S {};
?这里 TypeOrValue
表示 typename
或 auto
,顺序或计数不限。
你不能。
您可以编写 hana 风格的元编程,其中所有内容都是一个获取和返回值的 constexpr 函数,wrappers/unwrappers 在每一端转换模板元编程。但这只是将工作转移到包装器中。
严格来说,你不能按照你的要求去做。但是您可以做的是将值表示为特殊类型,然后将该特殊类型与其他“正常”类型混合。例如,助手可能看起来像这样(未经测试的代码):
template<auto v>
struct value {};
然后任何 value<...>
的出现都表明是一个值,而不是一个类型。用这个做任何有用的事情都可能很挑剔,因为你必须专门处理 value<...>
,但它可以工作。
要在模板中添加任何类型,只需编写 template <typename ...> struct S {};
.
要在模板中有任何值(例如 int
值),可以写 template <auto ...> struct S {};
.
要在模板中包含任何类型的模板,请编写 template <template <typename ...> class Tmpl> struct S {};
。
但是模板中怎么会有Anythings的模板呢? Anythings 意味着 1) 类型或 2) 值或 3) Anythings 的其他模板? IE。在模板中混合所有可能的东西。
即如何写template <template <Anything ...> class Tmpl> struct S {};
types/values/templates 可以在 Tmpl
参数列表中以任意顺序混合。
具有这种接受任何类型模板的结构 S
的一个用例是实现模板特征,即 S
可以以某种方式告诉 1) Tmpl 有多少参数。 2)对于每个参数(通过索引),它可以判断它是类型还是值还是另一个模板。
S
的另一个用例是需要它来实现丰富的编译时信息。 IE。如果我能说出有关传入模板的所有信息,它有多少参数以及它有什么参数,那么我就可以递归地组合复合类型 ID 或类型名称,从而进行编译时类型反射。
我还想知道如何在一个模板中以任意顺序至少混合类型和值? IE。怎么有template <TypeOrValue ... Args> struct S {};
?这里 TypeOrValue
表示 typename
或 auto
,顺序或计数不限。
你不能。
您可以编写 hana 风格的元编程,其中所有内容都是一个获取和返回值的 constexpr 函数,wrappers/unwrappers 在每一端转换模板元编程。但这只是将工作转移到包装器中。
严格来说,你不能按照你的要求去做。但是您可以做的是将值表示为特殊类型,然后将该特殊类型与其他“正常”类型混合。例如,助手可能看起来像这样(未经测试的代码):
template<auto v>
struct value {};
然后任何 value<...>
的出现都表明是一个值,而不是一个类型。用这个做任何有用的事情都可能很挑剔,因为你必须专门处理 value<...>
,但它可以工作。