<型名...>构 空器{用 型=;};<型名...A>用 是空型=型名 空器<A...>::;<型名 T,型名=>构 是灵针:假型{};<型名 T>构 是灵针<T,是空型<推导(求值<T>().符号->()),推导(求值<T>().())>>:真型{};//推导失败没啥
//有这两个操作的就是灵针.
//只要返回入,则可以导入元<型名 F>中
枚 针型{是引,是针,是灵};<型名 F>常式 整 求针型(){(是指针值<F>)中 是针;
    异 如(是灵针<F>::)中 是灵;//要加个值
    异 中 是引;
}//要加常式,<整 N,型名 P,型名 F>动 绑定实现(P&&p,F&&f){
    如 常式(N==1)[&](&&...o){(p->*f)(o...);};
    异 如 常式(N==2)[&](&&...o){(p.()->*f)(o...);};
    异 中[&](&&...o){(p.*f)(o...);};
}//要这样使用,这样分发,我叉,编译时计算的N,一定要加常式,这是关键<型名 P,型名 F>动 绑定(P&&p,F&&f){
    常式 整 N=求针型<F>();
    中 绑定实现<N>(前向<P>(p),前向<F>(f));
}//在这里,直接F.

代码如上.关键点是只要是使用编译时的N,无论在哪里都要加上常式.
参考地址.
人家的实现更复杂.我也不喜欢再绑定参数了,麻烦.
要深刻理解下面代码,如何编译时运算?,还是基础不牢:

template<std::size_t I>
auto& get(person& p) {
    if constexpr (I == 0) {
        return p.id;
    }
    else if constexpr (I == 1) {
        return p.name;
    }
    else if constexpr (I == 2) {
        return p.age;
    }
}
template <typename T>
std::string to_string(T t){
    if constexpr(std::is_same_v<T, std::string>)//常式,常式,有编译时就有常式.
        return t;
    else
        return std::to_string(t);
}