带有 MSVC 的可变参数模板
Variadic Templates with MSVC
今天我遇到了一个可怕的问题。我一直在使用可变参数模板的类上研究整个框架。事实证明,和我一起工作的人使用的是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;
相关文章:
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 如何使用可变参数模板强制转换每个变体类型
- 关于如何在具有单个参数的变体构造中选择替代方案?
- 调用参数排列不变函数 f(i++, i++)
- 参数归纳与标准::变体
- 模板化回调参数的逆变,如 C# 中的逆变
- 如何在没有参数包的情况下编写变差函数
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 获取模板参数的成员变量值列表
- 保留短 lambda 用作函数的中间参数,使用 clang 格式保持不变
- 如何定义变体<x,y,z>提取模板参数的子类型
- 正确对齐内存模板,参数顺序不变
- 递归中不同参数类型的变元模板函数
- 通过函数指针传递给变差函数的参数会更改其值
- 提升预定义为带有参数的全局 lambda 的变体访问者
- 使用可变参数模板参数提升变体访问者
- boost ::变体 - 为什么模板参数比const字符串参数具有更高的优先级
- 将变参数包中的值加载到临时数组中
- 使用额外参数提升变体访客
- 正在将动态数组元素解析为参数?(变音符)