如何在函数调用中解压缩模板参数
How to unpack template arguments in function call?
我有DefineEvent
类模板,用于简化新事件类的定义。它看起来是这样的(我知道,很多毛):
template<class EventClass, class... Parents>
class DefineEvent : public virtual Event, public Parents...
{
public:
DefineEvent()
{
static const EventTypeInfo& info = TypeInfoParentSetter<EventClass>
::SetOnce<Parents...>(TypeInfoHolder<EventClass>::Instance());
}
};
我在那里使用的TypeInfoParentSetter
类看起来是这样的:
template<class EventClass>
class TypeInfoParentSetter
{
public:
template<class... Parents>
static const EventTypeInfo& SetOnce(TypeInfoHolder<EventClass>& holder)
{
// ...
}
};
我收到一个指向DefineEvent()
中::SetOnce<Parents...>
行的编译错误,告诉我编译器"在‘…’标记之前应该有主表达式"。我该如何解决这个问题?
您可以在这里的上下文中查看代码,但请注意,它非常难看。
您需要包含一个template关键字来表示嵌套名称为template:
DefineEvent()
{
static const EventTypeInfo& info = TypeInfoParentSetter<EventClass>
:: template SetOnce<Parents...>(TypeInfoHolder<EventClass>::Instance());
}
并且您忘记将成员函数TypeInfoParentSetter<EventClass>::Set
设置为静态:
template<class... Parents>
static TypeInfoParentSetter<EventClass> Set(TypeInfoHolder<EventClass>& holder)
{
std::cout << "ParentSetter()n";
return TypeInfoParentSetter<EventClass>();
}
检查:http://ideone.com/sNHMX
可能您必须在SetOnce:之前使用"template"关键字
template<class EventClass, class... Parents>
class DefineEvent : public virtual EventClass, public Parents...
{
public:
DefineEvent()
{
static const EventTypeInfo& info =
TypeInfoParentSetter<EventClass>::template SetOnce<Parents ...>(TypeInfoHolder<EventClass>::Instance());
}
};
相关文章:
- 使用C++进行运行长度解压缩
- C++ 如何将数组值解压缩为函数参数
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 解压缩 C 样式数组以及C++中的参数包
- 将参数包解压缩到 std::initializer_list?
- 解压缩可变模板参数
- 为流运算符返回代理类时解压缩参数
- 在解压缩可变参数模板时避免"recursive"函数调用,直到运行时条件
- 为什么不能将此参数包直接解压缩到向量初始值设定项列表中?
- 是否可以使用 Boost.Hana 将 std::array 解压缩到非类型模板参数包中
- 通过将两个参数包的元素线程化为类型对来解压缩这两个参数包
- 当构造函数采用自身时解压缩可变参数模板化类?
- 在 c++17 中解压缩可变参数元组
- 将参数包解压缩到字符串视图中
- 将"stored"可变参数模板类型解压缩为模板参数
- 可变参数模板将参数解压缩为类型名
- 任何解压缩向量以在C++中函数参数的解决方案
- 将可变参数模板参数解压缩到数组中,应用每种类型的函数
- 如何在函数调用中解压缩模板参数
- 使用Variadic模板解压缩参数列表时获取参数索引