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

标签 c++ templates instantiation tmp

现在,我对模板很熟悉,对 SFINAE 之类的东西也有点熟悉,而且我一直想知道当模板被编译器实例化时会发生什么。

当您在 TMP 中执行操作时,例如 SFINAE,甚至是 TMP 中的简单斐波那契数列,编译器似乎所做的比我在模板实例化。编译器似乎正在执行模板代码。

我的问题是,template instantiation 到底是什么?编译器实际执行代码的那条线在哪里?

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

最佳答案

最好把它想象成一堆函数,这就是它的真实面目。考虑一个类 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) 它如何扩展到模板提供的任何其他功能。

因为实例化模板是图灵完备的,所以您无法以任何其他方式处理它。编译器似乎正在执行它们的原因是因为它。它们只不过是语法错误的有限 EDSL 中的函数。

关于C++模板实例化,究竟是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10508321/

相关文章:

c++ - 解码日期格式?

java - 如何克隆被声明为抽象父类(super class)的对象?

c++ - 用户定义类的交换函数从未实例化?

c++ - 为什么总和为0?

c++ - 是否有具有多访问方法的可变参数模板变体?

c# - 跟踪基类中的实例化

c++ - 使用指针创建静态数组?

C++ 结构数组 Win Form 损坏

c++ - Fedora 17 和 Google Protocol Buffers

c++ - makefile 和多文件 C++ 模板问题