用 std::variant 的坑
decltype 推导可能带有 &
属性
被 decltype
坑了很多次。推导出来可能有引用类型,想要值类型时需要先去掉!
不同的 variant 在 visitor 的参数里必须独立
std::visit
的多个参数必须独立和模板参数匹配(或者 lambda 和 C++20 函数的 auto),所以即便是要求两个类型相等,也必须写成这样:
template <typename DType1, typename DType2>
void f(DType1* input, DType2* output) {
// DType1 and DType2 are actually the same type.
}
如果确定两个类型一样,也可以少传入一个 variant,使用 void *
传入类型,然后手动做转换。
if constexpr 的编译问题
if constexpr 只在模板代码中才有去除分支的作用,在普通代码中是不行的,此时不能用来剔除不能编译的分支。