Pub*_*bby 2 c++ templates type-systems
C++被认为是静态类型的.我明白那个.
我不明白这是如何适用于模板的.
下面是一个在编译时无法确定的类型的简单示例:
template <typename... t>
struct foo {
using type = typename foo<t..., t...>::type;
};
foo<int>::type x; // type of x cannot be determined without running meta-program
Run Code Online (Sandbox Code Playgroud)
我认为有些情况下如果不解决暂停问题就无法检测到类型错误.
所以我的问题是,为什么不考虑动态输入模板?
静态/动态类型通常是指最终编译程序的运行时行为,而不是元程序.由于foo<int>::type在到达最终编译程序的运行时时解析,因此它被认为是静态类型的.
至于模板元程序,人们可以认为它是使用鸭子打字,这是一种动态类型.但是请注意,仍然存在静态类型(在前C++ 11中) - 模板上的模板参数的数量可以被视为生成具体类型的元函数的元类型(这是一个值就元节目而言).
相比之下,在Haskell中,他们有一个类型层次结构的概念.你有典型的类型 - 像函数,整数等等.然后你有'种类',它描述了类型的类型和元函数.例如,Haskell类* -> * -> *可以引用键到值的映射,就像template<typename Key, typename Value> class Map在C++中一样.对语言是静态还是动态类型的任何确定都必须参考您所指的层次结构的哪个级别.从历史上看,C++模板在最初设计时从未真正被认为是元程序,因此这种术语在C++中并没有被广泛使用,但仍然可以应用相同的概念.