繁体   English   中英

循环可变参数模板类参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM