MST
星途 面试题库

面试题:C++模板与类型推导及约束

在C++20中,concepts用于对模板参数进行约束。请实现一个模板函数,它接受两个迭代器参数,要求这两个迭代器必须是随机访问迭代器,并且能处理不同类型但兼容的迭代器(如`std::vector<int>::iterator`和`std::vector<double>::iterator`),在函数内部对迭代器指向的元素进行加法操作(假设元素类型支持加法)。请详细说明如何利用concepts和类型推导来实现此功能。
34.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 引入必要的头文件
    #include <iostream>
    #include <vector>
    #include <concepts>
    
  2. 定义概念
    template <typename It>
    concept RandomAccessIterator = std::is_convertible_v<
        typename std::iterator_traits<It>::iterator_category,
        std::random_access_iterator_tag>;
    
    这里定义了一个名为RandomAccessIterator的概念,用于判断一个类型It是否是随机访问迭代器。std::is_convertible_v用于检查迭代器的类别是否可以转换为std::random_access_iterator_tag
  3. 实现模板函数
    template <RandomAccessIterator It1, RandomAccessIterator It2>
    requires std::same_as<typename std::iterator_traits<It1>::value_type,
                          typename std::iterator_traits<It2>::value_type>
    void addElements(It1 first1, It1 last1, It2 first2) {
        auto it1 = first1;
        auto it2 = first2;
        while (it1 != last1) {
            *it1 = *it1 + *it2;
            ++it1;
            ++it2;
        }
    }
    
    模板函数addElements接受两个随机访问迭代器It1It2requires子句用于进一步约束,确保两个迭代器指向的元素类型相同(使用std::same_as)。在函数内部,通过迭代两个迭代器,对指向的元素进行加法操作。
  4. 测试函数
    int main() {
        std::vector<int> vec1 = {1, 2, 3};
        std::vector<int> vec2 = {4, 5, 6};
        addElements(vec1.begin(), vec1.end(), vec2.begin());
        for (int num : vec1) {
            std::cout << num << " ";
        }
        return 0;
    }
    
    main函数中,创建两个std::vector<int>,调用addElements函数对其元素进行加法操作,并输出结果。

通过上述步骤,利用concepts定义了迭代器的约束,通过类型推导确定迭代器类型,从而实现了对随机访问迭代器指向元素的加法操作。