C++ 模板参数推导与统一

C++ 模板参数推导与统一,c++,templates,programming-languages,C++,Templates,Programming Languages,这六种函数模板有什么不同 模板参数推导和统一一个一般PLT概念之间的关系是什么 === 评论: 我知道要从你那里得到一些细节。但是这个网站仍然很混乱。也许更清楚一点的描述有助于处理模板参数推导过程。对于与PLT相关的问题,IMHO,统一在定义函数时推导类型。参数类型是从函数本身使用参数的方式推导出来的 模板参数函数在使用时被实例化。参数类型是从函数调用方传递的。然后编译器检查参数类型是否符合函数体中参数的使用方式。这听起来像“动态类型”,它可能允许更正确的代码,但可能拒绝更少的错误代码 下面的C

这六种函数模板有什么不同

模板参数推导和统一一个一般PLT概念之间的关系是什么

=== 评论:


我知道要从你那里得到一些细节。但是这个网站仍然很混乱。也许更清楚一点的描述有助于处理模板参数推导过程。

对于与PLT相关的问题,IMHO,统一在定义函数时推导类型。参数类型是从函数本身使用参数的方式推导出来的

模板参数函数在使用时被实例化。参数类型是从函数调用方传递的。然后编译器检查参数类型是否符合函数体中参数的使用方式。这听起来像“动态类型”,它可能允许更正确的代码,但可能拒绝更少的错误代码

下面的C++14代码可以工作。自动参数类型是通过模板在内部实现的

template<typename T>
void f1(T t);

template<typename T>
void f2(const T t);


template<typename T>
void f3(T& t);

template<typename T>
void f4(const T& t);


template<typename T>
void f5(T&& t);  //universal reference

template<typename T>
void f6(const T&& t);
使用纯统一,以下Haskell样式的代码将无法通过类型检查器

([] (auto f, auto b) {
    return b ? f(string("str")) : MyIntToString(f(MyInt(422)));
})([] (auto x) { return x; }, true)
“f”应同时为“Int->t1”和“String->t2”,两者并不统一


辛德利·米尔纳(Hindley Milner)也帮不上忙,因为它概括了“let”,但这里只是一个lambda论点。

花在观看上的时间是值得的。我敢说你的大部分问题可能都会被涵盖。f1和f2是相同的声明,即主体定义中的const only constraint。你所说的统一一般PLT概念是什么意思?我认为模板参数推导是一个从a和P确定模板参数T的过程。关于T,a,P的含义,请参阅。这个过程似乎链接了编写一个interepter时常用的统一。因此,我添加了一个通用程序语言theoryPLT概念。但我不确定,所以我在这里问。它可以是Int | String->t?
(\f b -> if b
         then f 1
         else StringToNumber(f "123")) (\x -> x) True