如何从父模板函数访问子成员?

How to access child member from parent's template function?

#include <iostream>
#include <functional>

using namespace std;

class Child;

class Parent {
    public:
    template <class Function, class... Args>
    void f(Function&& f, Args&&... args)
    {
        Child *c = dynamic_cast<Child*>(this);
        cout << c->n;
    }
};

class Child : public Parent {

public:
    int n = 0;
};

int main()
{
    Parent *p = new Child();
    cout << "abc";
    return 0;
}

该代码旨在从父模板成员函数访问子 class 的成员。我想这样做是因为模板成员函数不能是虚拟的。我得到的错误是:“'Child' 是一个不完整的类型”。我该怎么做?

可以把f的定义和声明分开,把定义移到classChild的定义之后。例如

class Child;

class Parent {
public:
    virtual ~Parent() = default;          // must be polymorphic type
    template <class Function, class... Args>
    void f(Function&& f, Args&&... args); // the declaration
};

class Child : public Parent {
public:
    int n = 0;
};

// the definition
template <class Function, class... Args>
void Parent::f(Function&& f, Args&&... args)
{
    Child *c = dynamic_cast<Child*>(this);
    if (c != nullptr)                     // check the result of conversion
        cout << c->n;
}

请注意

  1. 基数classParent必须是polymorphic type to use dynamic_cast;即它必须至少有一个 virtual 函数。
  2. 你最好在使用前检查dynamic_cast的结果。