c++ - 如何使函数能够获取指向不同类的指针?

标签 c++

#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仅引用了ClassAClassB的公共(public)字段>。还假设我们无法同时修改 ClassAClassB。如何定义一个函数,该函数可以采用指向 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 必须是 ClassAClassB

这是一个工作 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/

相关文章:

c++ - 重载运算符或数字转换的问题

c++ - 促进规则的精神转变

c++ - 不正确的矩阵乘法值

c++ - const char myStr[] = "hello"和 const char* myStr = "hello"有什么区别

c++ - 在 Visual C++ 2010 Windows 窗体项目中使用 HTML Tidy

c++ - 用于创建格式化字符串的可变参数模板

c++ - C++ 中椭圆的参数

c++ - 将 PEM 编码的 X.509 证书加载到 Windows CryptoAPI

c++ - 为什么可变参数模板在模板介绍中不起作用,但在 requires 子句中起作用? ConceptName{T,U,V,W} <-- 模板<类型名 ...T>

c++ - ./配置失败,错误 : Gentoo sanity check failed