Man*_*ink 1 c++ templates types
我有这个结构模板
template<typename N>
struct Succ{};
Run Code Online (Sandbox Code Playgroud)
和这个函数模板
template<typename N> N dec(Succ<N> s_n){
N n;
return n;
}
Run Code Online (Sandbox Code Playgroud)
这正是我想要的,如果我经常递减一次,我会收到编译器错误。
现在,我想在我的项目中使用这种风格的代码来捕获错误,但是创建初始“值”非常繁琐,我的意思是, 2 已经是Succ<Succ<SomeType>>。
如何使用 C++ 模板来完成此任务?就像是
Nat<2,SomeType> two;
Run Code Online (Sandbox Code Playgroud)
这与以下相同
Succ<Succ<SomeType>> two;
Run Code Online (Sandbox Code Playgroud)
有人可以给我这种模板编程的链接或其他资源吗?例如,如何使用 C++ 模板实现 Peano 算术以及如何更轻松地创建类型数字。
像这样的东西
template<typename N>
struct Succ{};
template<int N, typename T>
struct NatImpl
{
using type = Succ<typename NatImpl<N-1, T>::type>;
};
template<typename T>
struct NatImpl<0, T>
{
using type = T;
};
template<int N, typename T>
using Nat = typename NatImpl<N, T>::type;
Run Code Online (Sandbox Code Playgroud)
模板化using是一回事,但你不能专门化它们,所以这是在NatImpl课堂上完成的。
和证明
int main()
{
Nat<3,int> x = Succ<Succ<int>>();
}
Run Code Online (Sandbox Code Playgroud)
error C2440: 'initializing': cannot convert from 'Succ<Succ<int>>' to 'Succ<Succ<Succ<int>>>'