模板:静态类型还是动态?

时间:2012-01-02 02:58:39

标签: 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

我认为有些情况下,如果不解决暂停问题,就无法检测到类型错误。

所以我的问题是,为什么不考虑动态输入模板?

1 个答案:

答案 0 :(得分:7)

静态/动态类型通常是指最终编译程序在运行时的行为,而不是元程序。由于foo<int>::type在到达最终编译程序的运行时时被解析,因此它被认为是静态类型的。

对于模板元程序,人们可以认为它是使用duck typing,这是一种动态类型。但是请注意,仍然存在静态类型(在前C ++ 11中) - 模板上的模板参数的数量可以被视为生成具体类型的元函数的元类型(这是一个值就元节目而言。)

相比之下,在Haskell中,他们有一个类型层次结构的概念。你有典型的类型 - 像函数,整数等等。然后你有'种类',它描述类型的类型和元函数。例如,Haskell类* -> * -> *可以引用键到值的映射,就像C ++中的template<typename Key, typename Value> class Map一样。对语言是静态还是动态类型的任何确定都必须参考您所指的层次结构的哪个级别。从历史上看,C ++模板在最初设计时从未真正被认为是元程序,因此这种术语在C ++中并没有被广泛使用,但仍然可以应用相同的概念。