如何从父模板函数访问子成员?
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;
}
请注意
- 基数class
Parent
必须是polymorphic type to use dynamic_cast;即它必须至少有一个 virtual
函数。
- 你最好在使用前检查
dynamic_cast
的结果。
#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;
}
请注意
- 基数class
Parent
必须是polymorphic type to use dynamic_cast;即它必须至少有一个virtual
函数。 - 你最好在使用前检查
dynamic_cast
的结果。