使用成员函数模板实现接口的功能

Implementing an interface's function using member function templates

本文关键字:接口 功能 实现 函数模板 成员      更新时间:2023-10-16

我想知道是否有可能通过成员函数模板实现"接口"的功能,如下所示:

struct VisitorI
{
    virtual void Visit(int) = 0;
    virtual void Visit(float) = 0;
};
struct VisitorC : public VisitorI
{
    template<class T>
    void Visit(T) { /*Assume Visit(T) has syntatically the same implemenation for each relevant T */}
};

template void VisitorC::Visit(int);
template void VisitorC::Visit(float);

int main()
{
    VisitorC Visitor;
    return 0;
}

上面的代码无法编译,因为 foo(int) 和 foo(float) 在 VisitorC 中被认为是纯虚拟的,所以我认为这是不可能的。我真的看不出有什么特别的理由为什么不应该......?

干杯达米安

作为一种解决方法,您可以:

struct VisitorC : public VisitorI
{
    virtual void Visit(int a)   { Visit_impl(a); }
    virtual void Visit(float a) { Visit_impl(a); }
private:
    template<class T>
    void Visit_impl(T) { /* ... */ }
};