带有 MSVC 的可变参数模板

Variadic Templates with MSVC

本文关键字:参数 变参 MSVC 带有      更新时间:2023-10-16

今天我遇到了一个可怕的问题。我一直在使用可变参数模板的类上研究整个框架。事实证明,和我一起工作的人使用的是Visual Studio,它还不支持可变参数模板。

我试图使用宏无缝移植该功能,但经过长时间的工作,看起来不可能按原样移植。问题是模板的参数数量可能从零到四(或者可变参数模板的无穷大(。

即使我的宏是制作的,并消耗在这样的东西中:

template<>
Signal<void ()>
{
// My class
};

template<typename param1>
Signal<void (param1)>
{
// My class
};

但问题是它看起来不适用于 gcc(所以我假设它不适用于 vc(。

标头没有显示任何错误,但是如果我尝试像这样实例化类:

Signal<> mySignal;

我收到这些错误:

error: wrong number of template arguments (0, should be 1)

由于我没有找到有关该主题的信息,因此我至少想知道我正在尝试的内容是否可行?或者,如果我真的因为Microsoft认为可变参数模板不够重要而不得不再次编写数百行代码?

您不能有一个没有参数的模板,解决问题的常见方法是使用 void 或任何其他占位符。请注意,由于您正在模拟类似函数的对象,因此可以通过使用作为函数签名的单个类型来简化此操作:

Signal< void() >

这样,始终只有一个模板参数,您只需为签名具有 0 到 4 个参数的情况提供该模板的专用化:

template <typename S>
struct Signal;
template <typename arg1>
struct Signal<void (arg1)> { ... };
template <typename arg1, typename arg2>
struct Signal<void (arg1,arg2)> { ... };

如果您正在构建信号/处理程序或事件库,我建议您查看现有的实现。例如,考虑使用或至少查看升压信号/信号2库中的代码。


标头没有显示任何错误,但是如果我尝试像这样实例化类:

Signal<> mySignal;

问题是您的模板采用单个参数,即函数签名,但您没有提供任何参数。在实例化时,您需要提供模板参数。您可能打算这样做:

Signal<void ()> mySignal;