对于模板类/结构,模板可变参数必须位于模板参数列表的末尾。所以,直接,你只能使用一个。
但是您可以使用 std::tuple 来包装一个(或两个)可变参数包,用于类型,std::integer_sequence 用于整数值。
不幸的是,你必须使用模板特化:你必须声明主模板接收,例如,几个类型
template <typename, typename>
class Module;
以及一个使用单一类型名作为模板包装器的特化,如下所示
template <typename ... event_t, std::uint32_t ... stackDepth>
class Module<std::tuple<event_t...>,
std::integer_sequence<std::uint32_t, stackDepth...>>
{
// ...
};
鉴于您可以在末尾放置一个可变参数列表,您可以避免使用第二个包装器,因此,例如,
template <typename, std::uint32_t...>
class Module;
template <typename ... event_t, std::uint32_t ... stackDepth>
class Module<std::tuple<event_t...>, stackDepth...>>
{
// ...
};
鉴于,如果我理解正确,类型 (event_t) 和数字 (stackDepth) 是相关的,并且您有一个模板类/结构接受单一类型和单一数字作为模板参数 ( Event_Handler),我想你可以直接使用Event_Handler作为可变参数。
我的意思如下(完整编译示例)
#include <cstdint>
template <typename, std::uint32_t>
struct Event_Handler
{ };
template <typename...>
class Module;
template <typename ... event_t, std::uint32_t ... stackDepth>
class Module <Event_Handler<event_t, stackDepth>...>
{
// ...
};
int main ()
{
Module<Event_Handler<int, 0u>, Event_Handler<long, 1u>> m;
}
-- 编辑--
OP 询问
其实我不想把它作为一个纯模板参数,而是作为构造函数中的一个实例。用这个技巧可以吗?
如果我理解正确,您正在寻找从 C++17 开始可用的“模板推导指南”(并且您标记了 C++17,所以应该适合您。
以下是完整的 (C++17) 编译示例; “显式演绎指南”是紧接在 main() 之前的构造
#include <cstdint>
template <typename, std::uint32_t>
struct Event_Handler
{ };
template <typename...>
class Module;
template <typename ... event_t, std::uint32_t ... stackDepth>
class Module <Event_Handler<event_t, stackDepth>...>
{
public:
Module (Event_Handler<event_t, stackDepth>...)
{ }
};
// explicit deduction guide
template <typename ... event_t, std::uint32_t ... stackDepth>
Module (Event_Handler<event_t, stackDepth>...)
-> Module<Event_Handler<event_t, stackDepth>...>;
int main ()
{
Module m(Event_Handler<int, 0u>{}, Event_Handler<long, 1u>{});
}