[英]Recurring variadic template class parameters
我想要一个可变参数模板类(具有N
模板参数)来定义N
成员函数,每个成员函数都从参数列表中获取单个类型的参数。 我尝试了这个:
template<class Derived, class... DerivedOthers>
class VtfVisitor : public VtfVisitor<DerivedOthers...>
{
public:
virtual void visit(Derived& derived) = 0;
};
template<class Derived>
class VtfVisitor
{
public:
virtual void visit(Derived& derived) = 0;
};
由于我无法重新定义模板类,因此无法使用。 然后我尝试了Bo提出的解决方案:
template<class Derived, class... DerivedOthers>
class VtfVisitor : public VtfVisitor<DerivedOthers...>
{
public:
virtual void visit(Derived& derived) VISITOR_CVQ = 0;
};
template<class Derived>
class VtfVisitor<Derived>
{
public:
virtual void visit(Derived& derived) VISITOR_CVQ = 0;
};
仍然不起作用:使用VtfVisitor<D1,D2>
尝试此操作时,实例化的模板类中未定义成员函数visit(D2&)
(而visit(D1&)
则定义明确)。
我怎样才能使它按预期工作?
感谢帮助。
您需要将省略号放在模板参数列表之外 :
template<class Derived, class... DerivedOthers>
class VtfVisitor : public VtfVisitor<DerivedOthers>...
{
public:
virtual void visit(Derived& derived) = 0;
};
例如,如果DerivedOthers...
是{int, char, float}
,则将得到以下扩展:
class VtfVisitor : public VtfVisitor<char>, VtfVisitor<float>
{
public:
virtual void visit(int& derived) = 0;
};
编译器认为您正在使用不同数量的参数重新声明同一类。
要为单参数情况创建特殊化,必须在类名后指定:
template<class Derived>
class VtfVisitor<Derived>
{
public:
virtual void visit(Derived& derived) = 0;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.