MST

星途 面试题库

面试题:C++中transform自定义操作在泛型编程与元编程中的应用

实现一个模板函数,该函数接受一个容器(支持`begin()`和`end()`),使用`std::transform`和自定义的元编程操作,根据容器元素的类型特性(例如,如果是整数类型则乘以2,如果是浮点数类型则除以2)对容器中的元素进行转换,并返回转换后的新容器。要求代码具有高度的通用性和可扩展性,能够适应不同类型的容器和元素类型,同时解释实现过程中所涉及的元编程概念及泛型编程技巧。
23.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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

// 元编程辅助结构体,用于根据类型选择操作
template <typename T, typename Enable = void>
struct TypeSpecificOperation {
    static T apply(T value) { return value; }
};

// 整数类型特化
template <typename T>
struct TypeSpecificOperation<T, std::enable_if_t<std::is_integral<T>::value>> {
    static T apply(T value) { return value * 2; }
};

// 浮点数类型特化
template <typename T>
struct TypeSpecificOperation<T, std::enable_if_t<std::is_floating_point<T>::value>> {
    static T apply(T value) { return value / 2; }
};

// 模板函数,接受一个容器并返回转换后的新容器
template <typename Container>
auto transformContainer(const Container& container) {
    using value_type = typename Container::value_type;
    std::vector<value_type> newContainer;
    newContainer.reserve(container.size());

    std::transform(container.begin(), container.end(), std::back_inserter(newContainer),
                   [](const value_type& value) {
                       return TypeSpecificOperation<value_type>::apply(value);
                   });

    return newContainer;
}

元编程概念解释

  1. 类型萃取(Type Traits)std::is_integralstd::is_floating_point 是C++标准库提供的类型萃取工具。它们用于在编译期判断一个类型是否为整数类型或浮点数类型。例如,std::is_integral<int>::value 在编译期会得到 true,而 std::is_integral<float>::value 会得到 false
  2. SFINAE(Substitution Failure Is Not An Error)std::enable_if_t 是利用SFINAE原则的工具。它通过在模板实例化时检查条件,如果条件不满足则导致模板替换失败,但这并不被视为错误,从而实现选择性地实例化模板。例如,TypeSpecificOperation<T, std::enable_if_t<std::is_integral<T>::value>> 只有当 T 是整数类型时才会实例化这个特化版本。

泛型编程技巧

  1. 模板参数推导:函数模板 transformContainer 利用模板参数推导,自动识别传入容器的类型,无需手动指定。
  2. 容器无关性:通过使用容器的 begin()end() 成员函数以及标准库算法 std::transform,代码可以处理任何支持这些接口的容器,如 std::vectorstd::list 等,实现了容器无关的编程。
  3. lambda 表达式:在 std::transform 中使用 lambda 表达式来调用 TypeSpecificOperationapply 方法,简洁地实现了对每个元素的类型特定操作。