MST

星途 面试题库

面试题:C++ 拷贝构造函数参数传递与模板元编程

结合模板元编程技术,实现一个通用的类,在拷贝构造函数调用时,根据不同的编译期条件,选择不同的参数传递方式(例如,对于特定类型使用引用传递,对于其他类型使用值传递),并阐述这种实现的原理和应用场景。
24.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

实现代码

#include <type_traits>

template <typename T>
class GenericClass {
private:
    T data;
public:
    // 普通构造函数
    GenericClass(const T& value) : data(value) {}

    // 拷贝构造函数,根据编译期条件选择参数传递方式
    template <typename U, typename = std::enable_if_t<std::is_same_v<U, T>>>
    GenericClass(const GenericClass<U>& other) {
        if constexpr (std::is_same_v<U, SomeSpecificType>) {
            data = std::ref(other.data.get());
        } else {
            data = other.data;
        }
    }
};

原理阐述

  1. 模板元编程:模板元编程允许在编译期进行计算和类型推导。通过模板参数和std::enable_if等工具,我们可以在编译期判断类型,并选择不同的代码路径。
  2. 条件编译if constexpr是C++17引入的特性,允许在编译期根据条件选择不同的代码分支。在这里,我们使用它来根据类型判断选择引用传递还是值传递。
  3. 类型萃取std::is_samestd::is_same_v用于判断两个类型是否相同,std::enable_if用于在满足特定条件时启用模板实例化。

应用场景

  1. 性能优化:对于大型对象,可以通过引用传递避免不必要的拷贝,提高性能。而对于小型对象,值传递可能更简单高效。根据类型动态选择传递方式可以兼顾不同情况。
  2. 通用库开发:在编写通用库时,需要考虑不同类型的使用场景。这种技术可以让库在处理不同类型时都能达到较好的性能和易用性。
  3. 代码复用:通过模板元编程实现的这种通用类,可以在不同项目中复用,减少重复代码。