如何在函数调用中解压缩模板参数

How to unpack template arguments in function call?

本文关键字:参数 解压缩 函数调用      更新时间:2023-10-16

我有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());
     }
};