重复的可变参数模板类参数

时间:2017-03-31 12:54:29

标签: c++ templates variadic-templates

我想要一个可变参数模板类(用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&)未在instanciated模板类中定义(visit(D1&)已明确定义)。

我怎样才能让它按预期工作?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您需要将省略号放在模板参数列表之外:

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;
};

答案 1 :(得分:1)

编译器认为您正在使用不同数量的参数重新声明相同的类。

要为单个参数案例创建专门化,您必须在类名后指定:

x509.py