繁体   English   中英

我可以写模板吗<typename t>只有一次?</typename>

[英]Can I write template <typename T> only once?

如果可能的话,我怎样才能避免在我的 2 个函数之上写两次 template < typename T> 使它们仍然适用于它们必须使用的每个参数类型?

而且,即使有可能,我怎么能只写 reverse_vector function 使其包含交换 function“内部”,所以我只能写一次模板?

(我仍然是一个学习基础知识的初学者,我绝对不知道是否有更好的方法来做我认为你已经理解我想做的事情。如果是,请说那些。非常感谢,晚上好。)

#include <iostream>
#include <vector>

template <typename T>//HERE...
void swap(T& a, T& b) {
    T tmp = a;
    a = b;
    b = tmp;
}

template <typename T>//...AND HERE
void reverse_vector(std::vector<T>& v) {
    if (v.size() % 2 == 0) {
        for (T i = 0; i < v.size() / 2; ++i) {
            swap(v[i], v[v.size() - 1 - i]);
        }
    }
}

void print_vector(std::vector<short int>& v) {
    for (unsigned short int i = 0; i < v.size(); ++i) {
        std::cout << v[i] << '\n';
    }
}

int main() {
    unsigned short int g;
    std::cout << "How large do you want the vector? _";
    std::cin >> g;

    std::vector <short int> v(g);

    for (unsigned short int i = 0; i < g; ++i) {
        v[i] = i + 1;
    }

    print_vector(v);
    std::cout << "\n\n\n";

    reverse_vector(v);
    print_vector(v);

    return 0;
}

你不能只写一次template <typename T> 但是你完全可以不用 c++20 来写它:

#include <concepts>

void swap(auto a, auto b) requires std::same_as<decltype(a), decltype(b)> {
  auto tmp = a;
  a = b;
  b = tmp;
};

requires 子句是为了确保你不会不小心交换不同类型的东西。 我可能只是打破了整个语义并进行了交换复制所有内容。 在使用之前考虑是否需要autoauto&auto&&以获得正确的交换语义。

PS:使用 std::ranges::swap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM