#include <iostream>
struct ClassA
{
int m_age = 1;
int m_height = 2;
};
struct ClassB
{
int m_age = 3;
int m_height = 4;
char m_grade = 'C';
};
void print_classa_info(const ClassA* ptr)
{
std::cout << "age: " << ptr->m_age << std::endl;
}
void print_classb_info(const ClassB* ptr)
{
std::cout << "age: " << ptr->m_age << std::endl;
}
int main()
{
ClassA classA;
ClassB classB;
print_classa_info(&classA);
print_classb_info(&classB);
return 0;
}
问题> 如您所见,print_classX_info
仅引用了ClassA
和ClassB
的公共(public)字段>。还假设我们无法同时修改 ClassA
和 ClassB
。如何定义一个函数,该函数可以采用指向 ClassA*
或 ClassB*
的指针,这样我就不必为 ClassA 定义两个打印函数
和 B 类
?
谢谢
最佳答案
这正是模板的用途:
template<typename T>
void print_class_info(const T* ptr)
{
static_assert(std::is_same_v<T, ClassA> || std::is_same_v<T, ClassB>);
if (ptr != nullptr)
std::cout << "age: " << ptr->m_age << std::endl;
}
这保证了 T
必须是 ClassA
或 ClassB
。
这是一个工作 demo .
正如 @Remy Lebeau 在评论中指出的那样,您可能更喜欢仅使用引用而不是指针。这避免了必须执行 nullptr
检查,因为必须使用对象来调用该函数。
template<typename T>
void print_class_info(const T &ref)
{
static_assert(std::is_same_v<T, ClassA> || std::is_same_v<T, ClassB>);
std::cout << "age: " << ref.m_age << std::endl;
}
请注意,现在需要像这样调用该函数
print_class_info(classA);
print_class_info(classA);
关于c++ - 如何使函数能够获取指向不同类的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61347758/