当您在模板元编程(TMP)中进行操作,例如Sfinae,甚至是TMP中简单的斐波那契序列时,它像编译器所做的那样,它比我在
templateInstantiation下所理解的要多。 看来编译器正在编译Execut模板代码。 我的问题是,wemplate Intantiatiation是什么,使用编译器实际执行代码在哪里?
编译器创建了您的模板类型,是我对模板实例化的理解。但是在TMP中,似乎做得比这更重要,这使我感到困惑。
最好将其视为一堆功能,这就是真正的功能。考虑一个类别的类,该类代表编译器的类型内部表示。
Type
在运行时C ++,您可以表达此AS
当然,要专业需要一点。但是,使用此模型,这很容易两件事。
a)实例化模板等同于函数调用,函数调用恰好在编译时发生,就像
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;
}
一样。当然,一个聪明的编译器可能会做其他事情作为优化,但在一般情况下。
B)它如何扩展到模板提供的任何其他功能。
由于实例化模板是图灵完整的,因此您无法真正处理任何其他方法。似乎编译器正在执行它们的原因是因为它是
IS。它们不过是在有限的EDSL中的功能,具有不良的语法。