0

今天我遇到了一个可怕的问题。我一直在研究一个使用可变参数模板的类的整个框架。事实证明,我正在使用的那个人使用 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)

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

4

1 回答 1

2

您不能有没有参数的模板,解决问题的常用方法是使用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)> { ... };

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


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

Signal<> mySignal;

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

Signal<void ()> mySignal;
于 2012-05-16T03:20:43.173 回答