MST

星途 面试题库

面试题:C++模板类派生中的类型转换与特化

假设有一个模板类`Base<T>`,其中`T`是数值类型模板参数。编写一个从`Base<T>`派生的模板类`Derived<T>`,要求在`Derived<T>`中实现一个成员函数`convertAndAdd`,该函数接收一个`Base<U>`类型的对象(`U`也是数值类型),将其成员变量转换为`T`类型后与自身的成员变量相加并返回结果。同时,为`Derived<bool>`提供特化实现,使得`convertAndAdd`函数能正确处理布尔类型的转换与相加逻辑。
30.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <type_traits>

// 基础模板类Base
template <typename T>
class Base {
public:
    T value;
    Base(T val) : value(val) {}
};

// 从Base<T>派生的模板类Derived
template <typename T>
class Derived : public Base<T> {
public:
    using Base<T>::Base;
    template <typename U>
    T convertAndAdd(const Base<U>& other) {
        static_assert(std::is_arithmetic<T>::value && std::is_arithmetic<U>::value, "T and U must be arithmetic types");
        return this->value + static_cast<T>(other.value);
    }
};

// Derived<bool>特化实现
template <>
class Derived<bool> : public Base<bool> {
public:
    using Base<bool>::Base;
    bool convertAndAdd(const Base<bool>& other) {
        return this->value != 0 || other.value != 0;
    }
};

你可以使用如下方式测试:

int main() {
    Derived<int> derivedInt(5);
    Base<double> baseDouble(3.5);
    std::cout << "Int + Double: " << derivedInt.convertAndAdd(baseDouble) << std::endl;

    Derived<bool> derivedBool(true);
    Base<bool> baseBool(false);
    std::cout << "Bool + Bool: " << (derivedBool.convertAndAdd(baseBool)? "true" : "false") << std::endl;

    return 0;
}