用 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 只在模板代码中才有去除分支的作用,在普通代码中是不行的,此时不能用来剔除不能编译的分支。