#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
。还要假设我们不能同时修改ClassA
和ClassB
。我如何定义一个函数,该函数可以使用指向ClassA*
或的指针ClassB*
,而不必为ClassA
和定义两个打印函数ClassB
?
谢谢
制作功能模板。
template <typename T>
void print_class_info(const T* ptr)
{
std::cout << "age: " << ptr->m_age << std::endl;
}
如果要确保T
必须为ClassA
或ClassB
,则可以申请std::enable_if
(使用其他类型的LIVE调用时,将得到不匹配的函数错误)。例如
template <typename T>
std::enable_if_t<std::is_same_v<T, ClassA> || std::is_same_v<T, ClassB>>
print_class_info(const T* ptr)
{
std::cout << "age: " << ptr->m_age << std::endl;
}
从C ++ 20开始,我们还可以使用Constraints。
template <typename T>
void print_class_info(const T* ptr)
requires std::is_same_v<T, ClassA> || std::is_same_v<T, ClassB>
{
std::cout << "age: " << ptr->m_age << std::endl;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句