c++模板中的实例化检查
我看到这样的一段代码:
// // Created by admin on 2022/8/6. // #ifndef COROUTINE_PRINTER_H #define COROUTINE_PRINTER_H #endif //COROUTINE_PRINTER_H #pragma once #include <iostream> #include <utility> namespace std { template <class T, class = decltype(std::declval<ostream &>() << *++std::declval<T>().begin()), class = decltype(std::declval<T>().begin() != std::declval<T>().end())> ostream &operator<<(ostream &os, T const &v) { os << '{'; auto it = v.begin(); if (it != v.end()) { os << *it; for (++it; it != v.end(); ++it) { os << ',' << *it; } } os << '}'; return os; } }
我看到上面的template头里面有两个class = ,却没有在底下被用到,而且两个都删除的画会报错。
经过我的思考和搜索,这两个class = 起的作用就是在重载模板函数的时候防止和之前写的相同名字的模板函数或者计算符号发生冲突。
或者起到模板函数特化的作用,同一个名字,模板不同
而且虚拟参数没有实际用处
2022/8/22日更新
此处等于std::enable_if,如果T类型不符合class的条件,编译器会出现substutition failure,这个函数实例化失败,
不会真正的运行.
但是由于substutition failure is not a error原则,编译器会寻找替代方案。可以在此处写一些重载,让函数可以在替换失败时
寻找另一个函数执行。
经过我的思考,以上为最终答案,两个都对,都是一方面的原因。