C ++模板实例化,究竟是什么意思?

时间:2012-05-09 00:24:56

标签: c++ templates instantiation tmp

现在,我熟悉模板,我对SFINAE这样的东西有些熟悉,而且我一直想知道编译器实例化模板时会发生什么。

当您在TMP中执行操作时,如SFINAE,甚至是TMP中的简单Fibonacci序列,似乎就像编译器在模板实例化中所做的更多>。似乎编译器正在执行模板代码。

我的问题是,模板实例化究竟是什么?编译器实际执行代码时绘制的线在哪里?

编译器创建了一个模板类型,是我对模板实例化的理解。但是在TMP中,似乎它做的远不止于此,这让我感到困惑。

1 个答案:

答案 0 :(得分:3)

最好将它视为一系列功能,这就是它的真实含义。考虑一个类Type,它在这里表示编译器的类型的内部表示。

template<typename T> class X {
    T t;
};

在运行时C ++中,您可以将其表示为

Type* X(Type *t) {
    static std::unordered_map<Type*, Type*> cache;
    if (cache.find(t) != cache.end())
        return cache[t];
    Type* ret = new Type;
    ret->DataMembers.insert("t", t);
    return cache[t] = ret;
}

当然,专业化等需要额外的一点。但是,使用这个模型,很容易做到两件事。

A)实例化模板等同于函数调用,它恰好发生在编译时,就像constexpr一样。当然,一个聪明的编译器可能会做一些其他的优化,但在一般情况下。

B)它如何扩展到模板提供的任何其他功能。

因为实例化模板是Turing-complete,所以你无法以任何其他方式真正处理它。编译器执行它们的原因是因为。它们只不过是有限EDSL中的函数,语法错误。

相关问题