MST

星途 面试题库

面试题:C++函数模板类型参数兼容性之高级问题

考虑一个函数模板template <typename T> void func(T a, T b),现在有两个自定义类型class C { /*... */ }和class D { /*... */ },D不是从C继承而来,但在某些情况下希望能将C和D类型的对象传递给func函数,你将如何通过类型转换或其他C++特性来实现这种兼容性?请详细说明实现思路并给出代码示例。
43.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 由于D不是从C继承而来,要使func函数能接受CD类型的对象,可以使用模板特化或者自定义类型转换。这里采用自定义类型转换的方式,在D类中定义一个转换为C类型的函数。这样在调用func时,如果参数类型不匹配,编译器会尝试使用自定义类型转换来使参数类型一致。
  2. 代码示例
#include <iostream>

class C {
public:
    int data;
    C(int d) : data(d) {}
};

class D {
public:
    int data;
    D(int d) : data(d) {}
    // 定义转换为C类型的函数
    operator C() const {
        return C(data);
    }
};

template <typename T>
void func(T a, T b) {
    std::cout << "a.data: " << a.data << ", b.data: " << b.data << std::endl;
}

int main() {
    C c(10);
    D d(20);
    // 这里d会通过自定义类型转换为C类型
    func(c, d); 
    return 0;
}

在上述代码中:

  • D类定义了一个转换为C类型的函数operator C()
  • func函数模板接受两个相同类型的参数。
  • main函数中,func(c, d)调用时,d会被自动转换为C类型,从而满足func函数模板的参数类型要求。