使用 C++ 模板在类型系统中实现自然数

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 算术以及如何更轻松地创建类型数字。

joh*_*ohn 5

像这样的东西

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>>>'